Округление до определенного количества цифр в Haskell

Я пытаюсь сделать функцию для округления числа с плавающей запятой до определенной длины цифр. Что я придумала до сих пор, так это:

import Numeric;

digs :: Integral x => x -> [x] <br>
digs 0 = [] <br>
digs x = digs (x `div` 10) ++ [x `mod` 10]

roundTo x t = let d = length $ digs $ round x <br>
                  roundToMachine x t = (fromInteger $ round $ x * 10^^t) * 10^^(-t)
              in roundToMachine x (t - d)

Я используюdigs функция для определения количества цифр перед запятой для оптимизации входного значения (т. е. переместить все через запятую, поэтому1.234 становится)0.1234 * 10^1

roundTo функция, кажется, работает для большинства входных данных, однако для некоторых входных данных я получаю странные результаты, например,roundTo 1.0014 4 производит1.0010000000000001 вместо .1.001

Проблема в этом примере вызвана вычислением1001 * 1.0e-3 (который возвращается)1.0010000000000001

Это просто проблема в представлении чисел на Haskell, с которым мне приходится жить, или есть лучший способ округлить число с плавающей запятой до определенной длины цифр?

Ответы на вопрос(2)

Ваш ответ на вопрос