【发布时间】:2014-04-26 16:09:37
【问题描述】:
我敢打赌这里有一个类似的问题,我只是找不到它。
问题是关于修复 java 数学不准确的问题,例如当我得到像 235.00000002 或 9875.999999997 这样的数字时。天啊,对于人类来说,这两个实际上是指235 和9876,当给定一定的准确度阈值时,我们称之为“5 个零或九”。
但这不仅仅是关于小数点右边的数字,同样的规则也应该适用于像23500000001.0和5699999999.0这样的数字
有什么想法/库吗?
更新:
看起来我错了,说这是一个已知的主题,几分钟后就会有人弹出一个已知的库。所以这是我期望的逻辑:
对于给定的数字,当在其字符串表示中遇到 N 个连续的零或九时,这些零和九与最右边的“0”或“9”右侧的其余数字一起四舍五入。
例如,当 N=5 时,数字 239999995.546 变为 240000000.0,数字 34.0000007 变为 34 以及 340000.007 变为 340000。
更新 2:
这就是在匆忙或对问题没有足够关注时发生的情况。对不起。我说的是“人类”四舍五入。一个很好的例子是在 linux 机器上比较 df 和 df -h 的输出。至于我说的“不准确”,请运行以下代码:
double d = 1000.0;
double mult = 0.12351665;
System.out.println(d * mult / mult);
响应绝对不是您在购物车中显示的响应。就我而言,情况更糟,不仅仅是我处理的钱,它可以是任何东西——百分比、大数字、小分数,所有这些都是相对繁重的数学计算的结果。所以我说的是对人类有意义的四舍五入。
我已经完成了代码,但仍有可能有人做得更好。
【问题讨论】:
-
这里似乎没有真正的问题。
-
@OliCharlesworth,是什么阻止了它成为问题?
-
您需要更准确地定义您的问题。尝试定义一般的舍入规则(根据您的任何要求)。然后,如果您在实施它时遇到任何问题,请在此处发布并寻求帮助。你现在的问题非常模糊。
-
好的,明白了,我只是认为这是一个明显且众所周知的问题,有一个已知的解决方案。我会重写问题。
-
我刚刚意识到您的舍入规则不一致:为什么
240000000.0保留.0而340000和34没有?此外,Formatter%e提供的科学记数法可能会对您有所帮助,它为239999995.546提供2.400000e+08
标签: java rounding rounding-error