在c++中从双精度对象中检索分数部分

Retrieving Fraction part from a double in C++

本文关键字:检索 数部 对象 双精度 c++      更新时间:2023-10-16

我以双精度输入,然后对其进行类型转换,以便取出分数部分。但是当输入是一个小的数比如说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;

这只是一个精度问题。双精度数有52位尾数,表示大约15-17位的十进制数字。第二个例子达到了这个极限,分数(0.2)很可能没有存储在双精度对象中。

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

你可以看看下面的

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

double的取值范围:1.7E +/- 308(15位)
无符号long long的取值范围:0到18,446,744,073,709,551,615(20位)

首先是=(unsigned long long) a;
如。如果在"a"中插入9007199254740991.2,则
插入的值为

    a = 9,0072e+015 
    first :90071992547409910

因此是精度问题

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

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

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