gpt4 book ai didi

Java DecimalFormat HALF_UP 舍入错误

转载 作者:行者123 更新时间:2023-12-01 07:01:41 24 4
gpt4 key购买 nike

我正在使用带有 HALF_UP 舍入模式的 DecimalFormat,但我有一个无法正常工作的场景,我不知道为什么。

DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
float tmp = (float) (0.5 * 1.05);
df.format(tmp);
float mul = Float.parseFloat(df.format(tmp));

我希望 mul 变量值具有 0.53 值,而我收到了 0.52 值。

我使用的是 Java 1.8.0_131。

解决的最终代码

BigDecimal mul = new BigDecimal(0.5).multiply(new igDecimal(1.05));
mul = mul.setScale(2, RoundingMode.HALF_UP);
System.out.println(mul);

最佳答案

您正在使用float数据类型。

此数据类型无法精确保存值0.525。请参阅此代码以使其清楚:

float value = (float) (0.5 * 1.05);
DecimalFormat df = new DecimalFormat("#.########################");
System.out.println(df.format(value));

打印出:

0.5249999761581421

使用模式 RoundingMode.HALF_UP 对此类值进行舍入将正确得到0.52

double似乎能够精确存储值0.525:

double value = 0.5 * 1.05;
DecimalFormat df = new DecimalFormat("#.########################");
System.out.println(df.format(value));

这将打印预期值:

0.525

使用模式 RoundingMode.HALF_UP 舍入该值现在将产生 0.53!

注意:即使是 double 数据类型也不能精确存储值!

看看@MarkDickinson 的评论。存储的值为 0.525000000000000002220446049250313080847263336181640625,它恰好大于 0.525,并且只是偶然舍入到预期值。

那该怎么办?

数据类型floatdouble是基于二进制的,而我们人类在处理数字时倾向于考虑基于十进制的。阅读文章"What Every Computer Scientist Should Know About Floating-Point Arithmetic"了解更多信息。

解决方案是使用基于小数的数据类型,该数据类型存在于 BigDecimal 中。

关于Java DecimalFormat HALF_UP 舍入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45096882/

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