处理浮点数的精度问题

我想知道是否有一种方法可以解决精度问题,这似乎是由于我的机器内部使用浮点数表示的结果:


为了清楚起见,问题总结为:


// str is "4.600";   atof( str ) is 4.5999999999999996  

double mw = atof( str )  


// The variables used in the columns calculation below are:   

//  

//                    mw = 4.5999999999999996  

//                    p = 0.2  

//                    g = 0.2  

//                    h = 1 (integer)  


int columns = (int) ( ( mw - ( h * 11 * p ) ) / ( ( h * 11 * p ) + g ) ) + 1;

在转换为整数类型之前,列计算的结果为1.9999999999999996;与2.0的预期结果相差甚远。


任何建议最欢迎。


当年话下
浏览 603回答 3
3回答

翻过高山走不出你

将浮点数舍入为整数的一种非常简单有效的方法:int rounded = (int)(f + 0.5);注意:这仅在f始终为正时才有效。(感谢j随机黑客)

心有法竹

当使用浮点算术时,严格相等几乎是没有意义的。您通常希望与可接受的范围进行比较。请注意,某些值不能完全表示为浮点值。了解每位计算机科学家应该了解的有关浮点算法和比较浮点数的知识。

蛊毒传说

没有准确性问题。您得到的结果(1.9999999999999996)与数学结果(2)相差1E-16。考虑到您输入的“ 4.600”,这非常准确。当然,您确实有一个舍入问题。C ++中的默认舍入是截断。您想要类似于Kip解决方案的东西。详细信息取决于您的确切域,您期望round(-x)== - round(x)吗?
打开App,查看更多内容
随时随地看视频慕课网APP