如何在 Haskell 中像在 C 中一样使用 printf 来舍入浮点数?

eig*_*irt 5 floating-point precision printf haskell number-formatting

我有一个简单的代码来读取浮点数并以六位小数打印它。

我的 C 代码可以工作,我想制作一个与 Haskell 语言相同的代码,而不需要安装任何额外的库。

我的解决方案在 C 和 Haskell 中非常简单:

C:

#include <stdio.h>
int main() {
    float n = 123.141568;
    printf("%.6f\n", n); // 123.141571
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哈斯克尔:

import Text.Printf (printf)
main = do
  let n = 123.141568 :: Float
  printf "%.6f\n" n -- 123.141570
Run Code Online (Sandbox Code Playgroud)

这些代码对于大多数数字都可以正常工作,但有一些不同的结果。例如,当n = 123.141568C 程序输出123.141571而 Haskell 程序输出123.141570. 如果我在 Haskell 中从 改为 ,Float结果Double123.141568

我的目标是让我的 Haskell 代码等于 C。我意识到即使在两种语言中使用 printf,舍入方法也是不同的,但我不知道这是如何发生的。

Float我尝试制作自定义舍入函数,但结果与(在上面的示例中123.141570)和Double123.141568)相同:

customRound x n = fromIntegral (round (x * 10^n)) / 10^n
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题有什么想法吗?

提前致谢!