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

我需要它进行计算,而不是在屏幕上输出。

到目前为止,我有:

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

    return _number;
}

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

我能做些什么?

最佳答案



不幸的是,根本问题没有解决:在您的平台上,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);

或者,您可以更改平台(编译器,数学库或浮点表示形式,例如,在受支持的地方使用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;

并且处理速度也较慢,但结果却不错-或与您​​告诉他们的一样好。

09-20 11:36