提问人:eightShirt 提问时间:6/30/2023 最后编辑:eightShirt 更新时间:7/1/2023 访问量:121
如何在 Haskell 中使用 printf 像在 C 中一样对浮点数进行四舍五入?
How to round float numbers in Haskell just like in C using printf?
问:
我有一个简单的代码来读取浮点数并用小数点后六位打印它。
我的 C 代码可以工作,我想在不安装任何额外库的情况下与 Haskell 语言相等。
我的解决方案在 C 和 Haskell 中非常简单:
C:
#include <stdio.h>
int main() {
float n = 123.141568;
printf("%.6f\n", n); // 123.141571
return 0;
}
哈斯克尔:
import Text.Printf (printf)
main = do
let n = 123.141568 :: Float
printf "%.6f\n" n -- 123.141570
这些代码适用于大多数数字,但有一些不同的结果。例如,当 C 程序输出并且 Haskell 程序打印时。如果我在 Haskell 中从 更改为 ,结果是 .n = 123.141568
123.141571
123.141570
Float
Double
123.141568
我的目标是使我的Haskell代码等于C。我意识到即使在两种语言中使用 printf 的舍入方法也不同,但我不知道它是如何发生的。
我尝试制作自定义舍入函数,但结果与(在上面的示例中)和()相同:Float
123.141570
Double
123.141568
customRound x n = fromIntegral (round (x * 10^n)) / 10^n
关于如何解决这个问题的任何想法?
提前致谢!
答: 暂无答案
评论
float
123.141568
float
%.15f
123.141570000000000
printf "%.6f\n" $ float2double n
n = 123.141568
在 或 中不完全表示。@eightShirt,发布一个最小的可重现示例,以清楚地展示您的代码。float
double
long double
float n
printf("%.5e\n", n);
printf("%.6g\n", n);