当double具有'exact'整数值时,如下所示:
double x = 1.0;
double y = 123123;
double z = -4.000000;
当通过(int)x,(int)y,(int)z强制转换为整数类型时,它是否可以保证正确地舍入到1,123123和-4? (而不是截断为0,123122或-5 b / c的浮点怪异)。我问b / c根据this page(这是关于lua中的fp,一种默认只有双倍数字类型的语言),讨论如何根据IEEE 754对双精度进行整数运算,但是我我不确定在使用整数类型参数调用C函数时,我是否需要担心手动舍入双精度,或者当双精度具有完全整数值时需要注意。
答案 0 :(得分:9)
是,如果整数值适合int
。
double
可能表示超出int
类型范围的整数值。例如,如果123123.0
类型只有16位,则int
无法转换为int
。
也不能保证double
可以表示特定类型可以表示的每个值。 IEEE 754使用52或53位的尾数。如果您的long
有64位,那么将非常大的long
转换为double
并返回可能不会给出相同的值。
答案 1 :(得分:3)
正如Daniel Fischer所说,如果double的整数部分的值(在你的情况下,精确的双精度)在你要转换的类型中是可表示的,那么结果就是精确的。如果该值超出目标类型的范围,则行为未定义。 “未定义”表示标准允许任何行为:您可能获得最接近的可表示数字,可能获得零,您可能会获得异常,或者计算机可能会爆炸。 (注意:虽然C标准允许您的计算机爆炸,甚至破坏宇宙,但制造商的规范可能会对行为施加更严格的限制。)
答案 2 :(得分:1)
如果真的是真整数,它会正确地执行它,在某些情况下你可能会得到保证。但如果该值是先前浮点计算的结果,则您无法轻易知道。
为什么不使用floor()函数显式计算值,如long value = floor(x + 0.5)
中所示。或者,更好的是,使用modf()函数检查整数值。
答案 3 :(得分:0)
是的,它会保留您给出的确切值,因为您在代码中输入了它。有时在计算中它会产生0.99999999999例如,但这是由于计算双精度而不是其存储容量时的错误