Округление до определенного количества цифр в 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, с которым мне приходится жить, или есть лучший способ округлить число с плавающей запятой до определенной длины цифр?