在 C++ 中减少 Double 的数字

bja*_*jar 3 c++ precision double function digit

我需要一个降低双精度精度(位数)的函数。

我需要它用于计算,而不是用于屏幕上的输出。

到目前为止,我所拥有的是:

double setDigits(double _number, int _digits)
{
    double tenth = pow((double)10,_digits);
    _number *= tenth;
    _number = floor(_number);
    _number /= tenth;

    return _number;
}
Run Code Online (Sandbox Code Playgroud)

调用setDigits(sqrt(2),3)给出 1.4139999999999999,而不是我想要的 1.414。

我能做什么?

LSe*_*rni 5

我能做什么?

不幸的是,根本问题没有任何意义:在您的平台中,1.414 没有精确的双重表示。你不能用“1.414”运行计算,因为你不能把“1.414”在任何地方 double

参见例如http://www3.ntu.edu.sg/home/ehchua/programming/java/DataRepresentation.html

可以做的是以最大精度保持您的数字,并以降低的精度显示它。您需要计算机器精度并跟踪计算过程中的错误。

因此,您将使用 1.413999999999997,最后得到的答案是 41.99999137;你会用它来显示

printf("The answer is %.3f\n", theAnswer);
Run Code Online (Sandbox Code Playgroud)

或者您可以更改平台(编译器、数学库或浮点表示,例如long double在支持的地方使用),但请记住,您可以以得到 1.873 错误的代价获得 1.414(例如 1.87299999999 或 1.87300000001) ,并且计算或多或少会有相同的误差。

您可以使用整数算术,将初始数字乘以 1,000,000(并得到 1414000)或其他合适的比例,然后在最后进行除法。不过,整数有一个最大界限。

还有一些任意精度库使用不同的内部表示,并允许您以所需的方式指定精度,例如 GMP ( http://gmplib.org/ )。当然,使用它比指定更困难

op1 = 6.0;
op2 = 7.0;
theAnswer = op1 * op2;
Run Code Online (Sandbox Code Playgroud)

处理速度也较慢,但结果很好——或者和你告诉他们的一样好。