我正在输入double,然后对其进行类型转换以取出小数部分。然而,当输入是一个小数字时,可以说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;
此致
答案 0 :(得分:2)
这只是一个精确的问题。双尾有52位尾数,它给出大约15-17位的十进制数字。你的第二个例子达到了这个限制,最可能的分数(0.2)没有存储在双倍中。
答案 1 :(得分:0)
当输入数字足够大以驻留在目标类型中时,它将转换为0.您将输入带有更大范围的double。并将其投射到具有较小范围的无符号长长度。这就是问题发生的原因。
您可以查看以下内容
http://www.tutorialspoint.com/cprogramming/c_type_casting.htm
答案 2 :(得分:0)
双倍范围: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
因此是一个精确的问题。这就是你遇到问题的原因。
答案 3 :(得分:0)
浮点数存储一定数量的数字。如果数字太长,则小数部分已超过数据类型的限制精度。
要获得比double
更重要的数据,请尝试long double
。例如,这会输出0.2
(大约,由于精度有限):https://ideone.com/i8Yyt0
您可能希望使用std::floor
执行舍入,因为将大数字转换为整数类型会导致未定义的行为,它超出整数类型的范围。 (它可能会崩溃,就像将整数除以零一样。)