如何获得Haskell双精度的n位数?

如何获得Haskell双精度的n位数?,haskell,double,Haskell,Double,我想要一个函数digits::Double->Int->Double,它给出n个双精度数字(必须舍入!),并返回一个只包含所需数字的新双精度数字 示例:数字1.2345 3->1.235 我可以使用字符串来实现这一点,但我认为有更好的解决方案。 你知道如何实现这个功能吗 提前谢谢 一个相对简单的方法是乘以适当的十次幂并取整,然后除以十次幂。例如: digits d n = fromInteger (round (d * 10^n)) / 10^n 在ghci中: > digits 1.2

我想要一个函数
digits::Double->Int->Double
,它给出n个双精度数字(必须舍入!),并返回一个只包含所需数字的新双精度数字

示例:
数字1.2345 3->1.235

我可以使用字符串来实现这一点,但我认为有更好的解决方案。 你知道如何实现这个功能吗


提前谢谢

一个相对简单的方法是乘以适当的十次幂并取整,然后除以十次幂。例如:

digits d n = fromInteger (round (d * 10^n)) / 10^n
在ghci中:

> digits 1.2346 3
1.235
> digits 1.2344 3
1.234
> digits 1.2345 3
1.234

最后一个示例显示Haskell在默认情况下使用了银行家舍入法,因此它并不完全符合您的规范——但也许它已经足够接近了,无论如何都是有用的。如果您真的需要,可以很容易地实现其他舍入变量(或在Hackage上找到它们)。

请记住,
Double
是一个二进制浮点数,永远不能精确表示
1.235
(正确的分数分母不是2的幂)。也就是说,这闻起来像是X/Y问题。如果您是为了表示而进行舍入,字符串确实是更好的选择。如果您需要精确的十进制计算(请注意:永远不要对货币使用浮动),最好使用定点计算(在引擎盖下使用
Integer
s而不是
Double
)。“更好的解决方案”是什么,取决于您为什么要这样做。提示:10^3==1000