我正在学习c,并且因为我的代码似乎在评估(1e16 - 1> = 1e16)时它很困惑,因为它应该是假的。我的代码在下面,它返回
//jComboBox1 = new javax.swing.JComboBox();
当我希望它不会返回任何东西时。我认为使用long long可以避免任何大数问题。
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(list1.toArray()));
答案 0 :(得分:3)
1e16是双重类型的文字值,浮点数/双精度数对于十进制算术/比较来说可能是不精确的(只是众多常见例子中的一个:十进制0.2)。为了进行比较,它会将长长的z向上投射加倍,我猜测标准的双重表示不能存储所需的精度(也许其他人可以演示二进制尾数/符号表示)< / p>
尝试将1e16更改为(长双倍)1e16,它不会打印出您的消息。 (更新:或者,正如另一个问题评论者所添加的,将1e16更改为整数文字)
答案 1 :(得分:1)
双打和浮点数可以包含有限的数字。在您的情况下,值为9999999999999999
和1e16
的双数字具有相同的8字节十六进制表示。您可以逐字节检查它们:
long long z = 9999999999999999;
double dz1 = z;
double dz2 = 1e16;
/* prints 0 */
printf("memcmp: %d\n", memcmp(&dz1, &dz2, sizeof(double)));
所以,他们是平等的。
较小的整数可以以完美的精度存储在double中。例如,请参阅Double-precision floating-point format或biggest integer that can be stored in a double
可以转换为双精度的最大整数是2 53 (9007199254740992
)。