我意识到十进制数只能在二进制系统中精确存储为浮点数,但我不明白的是我输出的10/7小数点后7位发生的情况。
在我的第一次输出测试中,我注意到浮动结束时的5(第7位)和4(第7位),然后是双精度中的2。我认为浮动中的第7位将是4,因为双排位的第8位是2。
Float 1.4285715 双1.4285714285714286
然后我使用float格式将下一个输出测试运行到17个位置。每个中的第8个位置是不同的 - 浮点数是6,这就是为什么第7位被舍入为5我假设。
Float 1.428571462631225600 双1.428571428571428600
在第三次输出测试中,我尝试使用字符串格式进行直接强制转换,看看会发生什么。我得到了与第二次测试相同的结果。
如果我对复杂的浮点存储方法有一个简单的问题 - 我很抱歉。
float f = 10/7f;
double d = 10/7d;
System.out.format
("Float %1s\nDouble %2s\n", f,d);
/*
* Float 1.4285715
Double 1.4285714285714286
*/
System.out.format
("Float %1$.17f\nDouble %2$.17f\n", f,d);
/*
* Float 1.428571462631225600
Double 1.428571428571428600
*/
System.out.format
("Float %1s\nDouble %2s\n", (double)f,d);
/*
* Float 1.4285714626312256
Double 1.4285714285714286
*/
答案 0 :(得分:6)
在我的第一次输出测试中,我注意到浮动结束时的5(第7位)和4(第7位),然后是双精度中的2。我认为浮动中的第7位将是4,因为双排位的第8位是2。
如果您认为浮点数在内部以十进制存储并四舍五入到某些十进制数字,则此期望才有意义。但事实并非如此,浮动内部存储在二进制中并四舍五入到一些二进制数字。
您的期望是基于对浮点数的存储方式的误解。您会看到双精度具有更准确的小数位,因为这是因为它们具有更准确的二进制位置。该实现根本不以十进制形式存储数字。
答案 1 :(得分:3)
Java uses IEEE-754 for representing floating point numbers。您可以阅读有关IEEE-754 standard in many places。
的更多信息答案 2 :(得分:2)
有关简化说明,请尝试以下网站:
http://floating-point-gui.de/basic/
要获得非常详细的解释,请尝试以下方法:
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
答案 3 :(得分:1)
当您使用float
时,它会使用此数字的默认精度8位数。当您指定精度时,它会清楚地表明它实际上使用double
来计算值。