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
我要说的是,尽管确实不能将许多十进制值精确存储在
float
或double
中,但对于这种大小的整数并不适用。它们可以很容易地以二进制浮点形式精确表示。 (不能总是精确地表示非常大的整数,但是这里我们不处理非常大的整数。)我强烈怀疑您的
double
值实际上略小于3669.0,但是无论您使用的哪种诊断设备,它的显示值都为3669.0。转换为整数值仅执行截断而不是舍入-因此出现了问题。假设您的
double
类型是IEEE-754 64位类型,则小于3669.0的最大值恰好是3668.99999999999954525264911353588104248046875
因此,如果您正在使用任何诊断方法将其值显示为3669.0,那么很有可能发生这种情况(我想说)。