我正在尝试创建一个函数来将浮点数舍入到定义的数字长度。到目前为止,我想出的是:
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 的数字表示中的一个问题,还是有更好的方法将浮点数舍入到特定长度的数字?