我需要一个函数来降低我的 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;
并且处理速度也较慢,但结果却不错-或与您告诉他们的一样好。