double a;
a = 3669.0;
int b;
b = a;

我在b中得到3668,而不是3669。

如何解决此问题?
如果有3559.8这样的话,我也想要3559而不是3560。

最佳答案

我怀疑您实际上没有这个问题-我怀疑您确实有:

double a = callSomeFunction();
// Examine a in the debugger or via logging, and decide it's 3669.0

// Now cast
int b = (int) a;
// Now a is 3668

我要说的是,尽管确实不能将许多十进制值精确存储在floatdouble中,但对于这种大小的整数并不适用。它们可以很容易地以二进制浮点形式精确表示。 (不能总是精确地表示非常大的整数,但是这里我们不处理非常大的整数。)

我强烈怀疑您的double值实际上略小于3669.0,但是无论您使用的哪种诊断设备,它的显示值都为3669.0。转换为整数值仅执行截断而不是舍入-因此出现了问题。

假设您的double类型是IEEE-754 64位类型,则小于3669.0的最大值恰好是
3668.99999999999954525264911353588104248046875

因此,如果您正在使用任何诊断方法将其值显示为3669.0,那么很有可能发生这种情况(我想说)。

10-07 21:55