为啥 double 和 float 存在? [复制]

Posted

技术标签:

【中文标题】为啥 double 和 float 存在? [复制]【英文标题】:Why do double and float exist? [duplicate]为什么 double 和 float 存在? [复制] 【发布时间】:2010-10-26 06:07:00 【问题描述】:

复制

When should I use double instead of decimal?

.. 还有更多...

由于它们的准确性,我们在整个应用程序中使用 C# 和 SQL Server 十进制数据类型。从来没有遇到过任何令人讨厌的问题,比如总数不等于细节等等。

我想知道为什么 double 和 float 存在,因为它们不准确

【问题讨论】:

复制:***.com/questions/803225/… 该链接上的一些很棒的答案 【参考方案1】:

浮点运算之所以出现,是因为它是在硬件成本合理的情况下对大量非整数进行运算的唯一方法。无限精度算术在多种语言(Python、LISP 等)和库(Java 的 BigNum、GMP 等)中实现,是需要更高准确性的人们(例如金融业)的替代方案。对于我们其他大多数处理中等数字的人来说,floats 或者当然是doubles 已经足够准确了。两种不同的浮点数据类型(分别对应于 IEEE 754 单精度和双精度),因为单精度浮点单元比双精度单元具有更好的面积、功率和速度属性,因此硬件设计师和程序员应该做出适当的权衡来利用这些不同的属性。

【讨论】:

【参考方案2】:

它们比十进制快很多,而且您通常不需要精确的精度。

【讨论】:

当你不关心 base 10 时,它们会更准确...... 我会挑战这个断言;我相信无限精度算术严格等于或优于浮点数。 @Matt J:SQL Server 十进制不是任意精度。 这取决于'decimal'的实现。并非所有名为“十进制”的类型都是无限精度的。有些就像浮点数或双精度数,但有更多位。其他人模仿十进制数学,但不是无限的(例如 sql),而是让您在某个限制内指定任意精度。 无论如何,无限精度是一条红鲱鱼。如果我们将枚举数和分母存储为不同的属性,则 1/3 可以存储为无限精确的数字,但我们可以这样做的唯一方法是:log(15)^e 将存储整个公式。当我们开始对彼此操作这些公式时,情况会变得更糟。近似是实用的……小数的近似值要好得多(但性能较差)【参考方案3】:

“十进制”是 128 位,双精度是 64 位,浮点数是 32 位。在过去,这很重要。

小数主要用于货币交易(以避免四舍五入),其他小数对于 29 位小数精度没有任何实际意义的一些事情来说已经足够了。

【讨论】:

29 位有效数字似乎没有实际用途,但请记住,每次操作都会降低精度。进行几次数学运算后,您的可靠有效数字可能会下降到 5。那时您从 29 开始。使用 7(浮点数),您可以在几次运算后找到达到 1-2 有效数字的方法。【参考方案4】:

十进制数据类型的缺点是性能。

这篇文章很好地涵盖了它:

Decimal vs Double Speed

【讨论】:

以上是关于为啥 double 和 float 存在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java float double精度为啥会丢失

float,double类型小数计算结果为啥不一样

在java中的double和float类型数据相除为啥可以除以零

为啥 float.NaN != double.NaN 在 C# 中?

float 和 double 数据类型是不是适合存储纬度和经度? [复制]

为啥我会从“double”转换为“float”,可能会丢失数据警告?(c)