使用float和double进行计算,给出不同的结果
Using float and double for calculation, giving different results
我正在做一个项目,我们正在计算小数点后 8 位商品的价格。
但有时计算结果不同。
我尝试了一些样本,但得到了不同的计算结果:
public static void main(String[] args) {
double value1 = 0.999939f * 0.987792f;
double value2 = 0.999939 * 0.987792;
double value3 = (double)0.999939f * 0.987792f;
System.out.println("value 1 : "+ value1);
System.out.println("value 2: "+ value2);
System.out.println("value 3 : "+ value3);
}
输出是:
value 1 : 0.9877317547798157
value 2 : 0.9877317446880001
value 3 : 0.9877317839126931
这三个是不同的结果。
我很困惑。谁能告诉我这里发生了什么?
谢谢
我经历了一些已经回答过的问题,但我只想要一些可以仅使用浮点数和双精度数进行计算的方法。否则我必须改变很多地方。会很痛的。
当你写一个带有"f"字符的数字时,它被认为是float
,意味着它是用32位编码的,而没有它,它是一个double
,编码64 位。
位数越多,表示十进制数的精度就越高。这对于小数位数很少的数字没有影响,但在您的情况下它很重要。
总而言之,在您的代码中只使用 double
个变量。
由于浮点数和小数的表示方式,转换可能会导致不同的结果。
对于:double value1 = 0.999939f * 0.987792f
您正在将两个浮点数相乘,然后将其转换为双精度数。生成的 float 表示形式是转换为 double 的表示形式。
对于:double value2 = 0.999939 * 0.987792;
您将两个双精度数相乘并将其保存在一个双精度数中。现在是时候没有转换了,所以表示永远不会改变(即,数据表示的变化不会导致潜在的数据丢失)。
对于:double value3 = (double)0.999939f * 0.987792f;
您正在乘以从浮点数转换而来的双精度数,再乘以一个浮点数。由于 Java 数学的工作原理,第二个浮点数可能也被转换为双精度数,所以现在你将两个曾经是浮点数的双精度数相乘,导致第三组表示。
因为 float 和 double 有不同的精度,每一个都会得到不同的结果。有关浮点运算的详细信息,请参阅 here。
我正在做一个项目,我们正在计算小数点后 8 位商品的价格。 但有时计算结果不同。
我尝试了一些样本,但得到了不同的计算结果:
public static void main(String[] args) {
double value1 = 0.999939f * 0.987792f;
double value2 = 0.999939 * 0.987792;
double value3 = (double)0.999939f * 0.987792f;
System.out.println("value 1 : "+ value1);
System.out.println("value 2: "+ value2);
System.out.println("value 3 : "+ value3);
}
输出是:
value 1 : 0.9877317547798157
value 2 : 0.9877317446880001
value 3 : 0.9877317839126931
这三个是不同的结果。
我很困惑。谁能告诉我这里发生了什么?
谢谢
我经历了一些已经回答过的问题,但我只想要一些可以仅使用浮点数和双精度数进行计算的方法。否则我必须改变很多地方。会很痛的。
当你写一个带有"f"字符的数字时,它被认为是float
,意味着它是用32位编码的,而没有它,它是一个double
,编码64 位。
位数越多,表示十进制数的精度就越高。这对于小数位数很少的数字没有影响,但在您的情况下它很重要。
总而言之,在您的代码中只使用 double
个变量。
由于浮点数和小数的表示方式,转换可能会导致不同的结果。
对于:double value1 = 0.999939f * 0.987792f
您正在将两个浮点数相乘,然后将其转换为双精度数。生成的 float 表示形式是转换为 double 的表示形式。
对于:double value2 = 0.999939 * 0.987792;
您将两个双精度数相乘并将其保存在一个双精度数中。现在是时候没有转换了,所以表示永远不会改变(即,数据表示的变化不会导致潜在的数据丢失)。
对于:double value3 = (double)0.999939f * 0.987792f;
您正在乘以从浮点数转换而来的双精度数,再乘以一个浮点数。由于 Java 数学的工作原理,第二个浮点数可能也被转换为双精度数,所以现在你将两个曾经是浮点数的双精度数相乘,导致第三组表示。
因为 float 和 double 有不同的精度,每一个都会得到不同的结果。有关浮点运算的详细信息,请参阅 here。