double a;
a = 3669.0;
int b;
b = a;
我在b中得到了3668,而不是3669。
我该如何解决这个问题?如果有3559.8之类的数字,我也希望得到3559而不是3560。
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,那么很可能(我会说是有可能)就是这种情况。
printf("a = %.50f\n", a);
的内容,以查看 a
的实际值。 - Keith Thompsonmain() {
double a;
a=3669.0;
int b;
b=a;
printf("b is %d",b);
}
输出结果为:b是 3669
当您写b=a;时,它会自动转换为整数。
see on-line compiler result :
这被称为隐式类型转换,详细信息请参考https://www.geeksforgeeks.org/implicit-type-conversion-in-c-with-examples/
代码示例请查看http://ideone.com/60T5b
int
中转换为双精度浮点数? - curiousguy这是臭名昭著的浮点数舍入问题。只需添加一个非常小的数字,即可纠正此问题。
double a;
a=3669.0;
int b;
b=a+ 1e-9;
// Discard the fractional part of d - truncation.
// Well defined when the truncated d is near the int range.
int i = (int) d;
double
转换为int
时需要解决一些问题。
当double
值的小数部分接近1.0时,如OP的真实情况下应该怎么办?通常会优先选择一个四舍五入的值。
如何检测/处理超出int
范围的double
?
无穷大和非数字呢?
如果范围检测不重要,则可以使用long lround(double)
一步完成四舍五入和转换:“...将其参数四舍五入为最接近的整数值,将中间值向远离零的方向舍入,而不考虑当前的舍入方向”。
#include <math.h>
int = (int) lround(d); // Since C99.
#include <limits.h>
#define INT_MAX_PLUS1 ((INT_MAX/2 + 1)*2.0)
#define INT_MIN_MINUS1 ((INT_MIN/2 - 1)*2.0)
#if INT_MIN == -INT_MAX
// Rare non-2's complement
if ((d < INT_MAX_PLUS1) && (d > INT_MIN_MINUS1)) {
#else
// 2's complement
if ((d < INT_MAX_PLUS1) && (d + INT_MIN > -1.0)) {
#endif
i = (int) lround(d);
} else {
fprintf(stderr, "Value %.17g not in int range [%d %d]\n", INT_MIN, INT_MAX);
}
通常情况下,当d
是not-a-number时,d < INT_MAX_PLUS1
为假。尽管false很常见,但C语言并不要求这种行为。或者可以这样表达:
#include <math.h>
if (!isnan(d) && (d < INT_MAX_PLUS1) && (d > INT_MIN_MINUS1)) {
...
int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);
这段代码的输出结果应该是b=3669,你需要仔细核对。
3669.0
在浮点数中可以精确表示... - Mysticial