0

我以双精度输入,然后对其进行类型转换以取出小数部分。但是,当输入是一个小数字时,可以说4294967295.2,小数部分被检索,但是当我输入一个更大的数字时,小数部分变为零。我知道这是一些数字,但我对这些东西有点陌生。当输入数字像.时,小数部分为零的原因是9007199254740991.2什么?这是代码:

unsigned long long first,second;
double a,b,remainderA,remainderB;
cout << "Enter first number:\n"<< endl;
cin>> a;
cout << "\nEnter second number:\n"<< endl;
cin >> b;

first=(unsigned long long) a;
second=(unsigned long long) b;

remainderA=a-first;
remainderB=b-second;


cout<<remainderA<<endl;

问候

4

4 回答 4

2

这只是一个精度问题。一个双精度数有 52 位尾数,它给出了大约 15-17 位的十进制数字。您的第二个示例达到了此限制,并且最有可能的分数 (0.2) 不会存储在双精度中。

于 2012-12-30T06:32:29.230 回答
0

当输入数字足够大以驻留在目标类型中时,它将强制转换为 0。您正在以具有更大范围的双精度输入。并将其转换为具有较小范围的 unsigned long long 。这就是问题发生的原因。

你可以看看以下

http://www.tutorialspoint.com/cprogramming/c_type_casting.htm

于 2012-12-30T06:29:04.280 回答
0

double 的范围为:1.7E +/- 308(15 位)
,unsigned long long 的范围为:0 到 18,446,744,073,709,551,615(20 位)

,您首先投射=(unsigned long long)a;
例如。如果您在“a”中插入 9007199254740991.2,则
插入的值为

    a = 9,0072e+015 
    first :90071992547409910

因此它的精度问题。这就是你遇到问题的原因。

于 2012-12-30T06:36:29.690 回答
0

浮点数存储一定数量的数字。如果数字太长,则小数部分已经超过数据类型的限制精度。

要获得更多的有效数字double,请尝试long double。例如,这个输出 0.2(大约,同样由于精度有限):https ://ideone.com/i8Yyt0

您可能希望用于std::floor执行舍入,因为将大数转换为整数类型会导致未定义的行为,它超出了整数类型的范围。(它可能会崩溃,例如将整数除以零。)

于 2012-12-30T07:09:29.807 回答