public class TestMain {
public static void main(String[] args) {
Double value = 1.25 * ((19.6 / 100) + 1);
System.out.println(value);
Double value2 = (1.25 * (19.6 / 100)) + (1 * 1.25);
System.out.println(value2);
}
}
结果是:
1.4949999999999999
1.495
我不明白为什么这些不同......
我添加了明确的括号来测试不同的情况,我不明白为什么Factored
表单返回1.49499
和developed
表单返回我想要的内容:1.495
答案 0 :(得分:2)
如果您需要具有浮点的精确结果,则可以使用BigDecimal类。
BigDecimal factor = new BigDecimal(19.6);
BigDecimal multiplier = new BigDecimal(1.25);
BigDecimal oneHundred = new BigDecimal(100);
BigDecimal one = new BigDecimal(1);
BigDecimal res = multiplier.multiply(factor.divide(oneHundred).add(one));
System.out.println(res);
BigDecimal res2 = multiplier.multiply(factor.divide(oneHundred)).add(one.multiply(multiplier));
System.out.println(res2);
结果:
1.495000000000000017763568394002504646778106689453125
1.495000000000000017763568394002504646778106689453125
答案 1 :(得分:1)
因为某些浮点数不能用有限数量的位表示而不能舍入。 Floating-point numbers的数字位数有限,它们不能准确地代表所有real numbers:当数字多于格式允许的数字时,剩余的数字将被省略 - 数字是四舍五入的。
您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic和this answer。
我不明白为什么这个因式表格返回1.49499并且开发的表单返回我想要的内容:1.495。
我不确定具体原因,但在第一种情况下,间歇性结果似乎是四舍五入的。
答案 2 :(得分:1)
基本概念
1.当我们addition
两个decimal
数时,它的小数点永远不会extends
2.当我们multiplication
两个decimal
数字时,它将extends
小数点作为要求。
了解概念Java代码
public static void main(String[] args) {
Double v1 = (19.6/100);
System.out.println("inti v1 = "+v1);
v1 += 1;
System.out.println("1 + v1 = "+v1);
v1 *= 1.25;
System.out.println("Ans = 1.25 * v1 = "+v1);
Double v2 = (19.6 / 100);
Double v3 = (double) 1;
System.out.println(" inti v2 = "+v2);
System.out.println("inti v3 = "+v3);
v2 *= 1.25;
v3 *= 1.25;
System.out.println("1.25 * v2 = "+v2);
System.out.println("1.25 * v3 = "+v3);
Double v4 = v2+v3;
System.out.println("Ans v2 + v3 = v4 = "+v4);
}}
<强>输出强>
1. inti v1 = 0.196
2. 1 + v1 = 1.196
3. Ans = 1.25 * v1 = 1.4949999999999999
4. inti v2 = 0.196
5. inti v3 = 1.0
6. 1.25 * v2 = 0.245
7. 1.25 * v3 = 1.25
8. Ans v2 + v3 = v4 = 1.495
在输出中显示行号以便于理解概念。
这不是一个不同的程序,而是在您的代码中逐个跟踪+
/ *
数学的过程。
你可以在输出中看到,
Line 3
,Line 6
,Line 7
我们在那里乘以extended
小数点。
并在Line 2
&amp; Line 8
我们addition
addition
,如您所知{{1}}永远不会延长其小数点获得最大小数点来显示。