一尘不染

了解浮点问题

c#

有人可以在这里帮助我了解如何确定浮点数限制何时会导致计算错误。例如下面的代码。

CalculateTotalTax = function (TaxRate, TaxFreePrice) {
     return ((parseFloat(TaxFreePrice) / 100) * parseFloat(TaxRate)).toFixed(4);
};

我无法输入对我造成此方法错误结果的任何两个值。如果删除toFixed(4),我实际上可以看到计算在哪里开始失去准确性(大约在小数点后第六位)。话虽这么说,但我对浮点数的理解是,即使很小的数字有时也可能无法表示,或者我被误解了,并且可以始终准确地表示4个小数位(例如)。

MSDN解释花车为这样的

这意味着它们不能保存任何非二进制分数的精确表示(形式为k /(2 ^ n),其中k和n为整数)

现在,我假设这适用于所有浮点数(包括javascript中使用的那些浮点数)。

从根本上说,我的问题可以归结为这一点。如何确定某个特定方法是否易受浮点运算中的错误的影响,这些错误将以多大的精度实现,并且需要哪些输入来产生这些错误?

希望我要问的是有道理的。


阅读 230

收藏
2020-05-19

共1个答案

一尘不染

首先阅读 每位计算机科学家应了解的有关浮点的知识
http :
//docs.sun.com/source/806-3568/ncg_goldberg.html

简短答案:双精度浮点数(JavaScript中的默认值)的精度约为16位十进制数字。四舍五入因平台而异。如果绝对要正确地找到正确的答案,则应该自己进行有理算术(这并不难-
对于货币,也许您可​​以乘以100来存储分的整数形式)。

但是,如果能够以高精度获得答案,则浮点数应该足够好,尤其是双精度。

2020-05-19