在c++中从双精度对象中检索分数部分
Retrieving Fraction part from a double in C++
我以双精度输入,然后对其进行类型转换,以便取出分数部分。但是当输入是一个小的数比如说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.htmdouble的取值范围: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)
相关文章:
- 从 opencv c++ 中的矢量中检索固定的帧数
- 初始化类中的指针数组,并在另一个类中检索它
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- ifstream不使用C 中的数组检索数据
- 无法从数组二次表达式中检索数据值
- 如何从DLL检索数组变量?(视觉C )
- 当我将字符串数组从 VBA 传递到 c++ 并将它们用作映射中的键时,为什么我无法从映射中检索数据(使用键)
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 如何在三维数组中使用std::map来存储/检索具有特定值的键
- 检索字符数组数据时出现问题
- 如何在 C++ 中传递和检索 char 数组
- 以数组的形式存储组合框项,并在 WPF 中检索 SelectedId
- 正在从数组中检索变量
- 如何检索智能指针数组的大小?(例如std::unique_ptr<int[]>)
- 从单独函数中的结构中检索数组成员
- 如何将数组添加到CvSeq,以及如何检索数组
- 检索数组的最干净的方法是什么?
- 通过 CComPtr 调用检索数组<IDispatch>