【发布时间】:2013-09-10 15:43:51
【问题描述】:
我正在尝试创建一个函数来将浮点数四舍五入到定义的数字长度。到目前为止,我想出的是:
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 数字表示中的一个问题,还是有更好的方法将浮点数舍入到特定长度的数字?
【问题讨论】:
-
我假设您知道 0.1 在底数为 2 时是不合理的,并且会 总是 不精确地表示吗?如果要四舍五入到指定的小数位数,则需要十进制表示,例如字符串。
-
请注意,这不是 Haskell 的事实,当不处理 arbitrary precision types 时,所有语言中都会发现相同的行为,而这些语言很少具有默认设置。欢迎来到关于在软件中处理财务计算的可怕部分。