所有方法 系统double 作为参数和返回参数。常数也是类型 double. 。我退房了 Mathnet.Numerics, ,那里似乎也是如此。

为什么是这样?特别是对于常数。不是 decimal 应该更准确吗?进行计算时,这通常不是有用的吗?

有帮助吗?

解决方案

这是经典的速度与准确性的权衡。

但是,请记住,例如,对于PI,您需要的数字最多的是41。

您需要的PI数字数量最多的是41。要以误差小于质子的直径计算宇宙的圆周,您需要41位PI†。似乎可以肯定地得出结论,对于可能遇到的任何圆圈测量问题,PI中有41位数字足够准确。因此,在2002年计算出的PI的超过一万亿位数字中,第41位以上的数字都没有实际价值。

另外,十进制和双重的内部存储结构略有不同。小数旨在存储基本10个数据,其中将其作为双打(和浮子)持有二进制数据。在二进制计算机(就像存在的每台计算机一样),在存储其范围内的任何数字时,双重浪费的位将更少。

还考虑:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

如您所见,十进制的范围较小,但精度更高。

其他提示

不, - 小数不比双打或任何类型的双打更“精确”。概念精确“(在纪念符中谈论数字表示)是错误的。任何类型绝对100%确切地表示 一些 数字。未签名的字节在表示从0到255的整数方面是100%精确的。但是它们对分数或范围以外的负面因素或整数不利。

小数是100%确切的代表一组 基础10 值。双打(因为他们使用 二进制 IEEE指数表示)精确表示一组 二进制 数字。两者都不比另一个更精确,它们仅仅是出于不同的目的。

为了详细说明,因为我似乎对某些读者来说还不够清楚...

如果您采用的每个数字表示为十进制,并将它们中的每个数字标记在一个数字线上,则 每一个 他们中的相邻对有一个额外 无穷 真实数字 不是 代表小数。可以对可以表示为双重的数字进行完全相同的陈述。如果您在数字线上标记为蓝色的每个小数,除整数外,每倍红色的双重双重线,则很少有两种颜色标记相同值的地方。通常,对于99.99999%的分数,(请不要nitpick我的百分比)蓝色集(小数)与红色集(双打)完全不同。

这是因为通过我们对蓝色集的定义,它是基本的10 Mantissa/enders代表,而双重表示是基本2 Mantissa/enders表示。任何表示为基本2 mantissa and enpents的值, (1.00110101001 x 2 ^ (-11101001101001) 意味着以mantsa的价值(1.00110101001)并将其乘以2升至指数的幂(当指数为负时,这等于将2除以2的幂)。这意味着,指数为负(或Mantissa的任何部分是分数二进制)的地方,该数字不能表示为十进制的Mantissa和指数,反之亦然。

对于任何随机落在实际数字行上的任意实际数字,它将更接近蓝色小数之一,或者接近一个红色双打。

小数更精确,但范围较小。通常,您将使用双倍进行物理和数学计算,但是您将使用小数点进行财务和货币计算。

有关详细信息,请参见MSDN上的以下文章。

双倍的http://msdn.microsoft.com/en-us/library/678hzkkkk.aspx

小数http://msdn.microsoft.com/en-us/library/364x0z75.aspx

似乎这里的大多数论点“它都不做我想要的”是“但是它更快”,ANSI C+GMP库也是如此,但是没有人提倡这一点吗?

如果您特别想控制准确性,那么还有其他语言花时间以用户可控的方式实现精确精度:

http://www.doughellmann.com/pymotw/decimal/

如果精度对您真的很重要,那么使用数学家使用的语言可能会更好。如果您不喜欢Fortran,那么Python是一种现代选择。

无论您使用什么语言,请记住黄金法则:避免混合类型...因此,在尝试操作员B之前,请转换A和B是相同的

如果我要猜测一个猜测,我会说这些功能会利用内部不使用小数的低级数学功能(也许在C中),因此返回小数将需要从双重铸件到十进制。此外,十进制价值类型的目的是确保准确性;这些功能没有 不能 返回100%准确的结果,没有无限精度(例如,非理性数字)。

如果您需要确切的东西,小数,浮动或双倍都不够好。此外,十进制是如此昂贵且过度使用,它正成为一个常规的笑话。

如果您的分数工作并需要最终的精度,请使用分数。这是相同的旧规则,仅在必要时仅转换一次。您的舍入规则也会有所不同,每个应用程序,域等等,但是确保您可以在合适的地方找到一个或两个奇数的示例。但是同样,如果您想要分数和最终的精度,答案是不使用分数的任何东西。考虑您可能还需要任意精度的功能。

通常,CLR的实际问题是,实现以通用方式处理数字的库是如此奇怪和平淡无奇,这在很大程度上是由于原始设计不良和该平台最受欢迎的编译器的缺点。与Java惨败几乎相同。

事实证明,Double只是涵盖大多数领域的最佳折衷方案,尽管JIT女士仍然无法利用现在大约15年历史的CPU技术,但它效果很好。

给MSDN放缓编译器的用户

Double是内置类型。 IS由FPU/SSE Core(以前称为“数学协调员”)支持,这就是为什么它快速的原因。特别是在乘法和科学功能下。

小数实际上是一个复杂的结构,由几个整数组成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top