在C ++中从double中检索Fraction部分

时间:2012-12-30 06:17:45

标签: c++ double fractions

我正在输入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;

此致

4 个答案:

答案 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执行舍入,因为将大数字转换为整数类型会导致未定义的行为,它超出整数类型的范围。 (它可能会崩溃,就像将整数除以零一样。)