gpt4 book ai didi

JAVA浮点运算

转载 作者:行者123 更新时间:2023-12-02 07:29:07 25 4
gpt4 key购买 nike

我在我的应用程序中进行了大量浮点运算,并且我知道浮点运算不是 100% 准确,这很好,但在打印结果时我还没有找到一种方法正确格式化。

例如

0.1 + 0.1 = 0.19999999999999999999999

Math.sin(Math.PI) = 1.2246E16 而不是 0

诸如 1.000000000000000001 之类的东西

我正在寻找一种通用方法来获取这些结果并获得正确的舍入值(以字符串形式)

这样0.1 + 0.1 = 0.19999999999999999999999 -> 0.2 这个需要向上舍入

Math.sin(Math.PI) = 1.2246E16 -> 0

诸如 1.000000000000000001 -> 1 之类的东西;而这个需要向下舍入

我还想避免在结果为以下情况时丢失数据1.1234567891234567 或 1.33333333333333 在这些情况下,结果应保持不变。

最佳答案

如果您想避免使用格式,可以在打印之前将结果舍入到固定精度,并利用 Java 会进行少量舍入的事实来隐藏表示错误。

例如保留小数点后 6 位

public static double round6(double d) {
return Math.round(d * 1e6) / 1e6;
}

可以准确表示round()1e6的结果。另外“IEEE 754 需要正确的舍入:也就是说,舍入的结果就好像使用无限精确的算术来计算值然后舍入” 剩下的唯一错误是表示错误,因为它采用最接近的可表示值。 Java 的 toString() 假设当您有一个具有最接近的较短十进制可表示值的 double 时,这就是您想要看到的。

例如0.1 的实际值为

System.out.println(new BigDecimal(0.1));

打印

0.1000000000000000055511151231257827021181583404541015625

但是当 Double.toString() 传递这个值时,它确定 0.1 将转换为这个 double,所以这就是它应该显示的内容。

顺便说一句,在 Java 6 中存在一个错误,它不使用最小位数。

for (int i = 1; i <= 9; i++)
System.out.print(i / 1000.0 + " ");

在 Java 6 中打印

0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0.0070 0.0080 0.0090

在 Java 7 中打印

0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009
<小时/>

如果性能不重要,我经常使用 printf,如果性能不重要,我会使用自定义例程将 double 写入直接 ByteBuffer 到固定精度(有效舍入它),这更快,因为它不会创建任何对象.

I'd also like to avoid losing data in cases like when the result is 1.1234567891234567 or 1.33333333333333 in those cases the result should remain the same.

在这种情况下,在需要显示结果之前不要对结果进行舍入。

关于JAVA浮点运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com