这个问题在这里已有答案:
我一直看到人们在C#中使用双打 . 我知道我读到某个地方,双打有时会失去精确度 . 我的问题是什么时候应该使用双倍,何时应该使用小数类型?哪种类型适合货币计算? (即超过1亿美元)
为了钱, always 十进制 . 这就是它被创造的原因 .
如果数字必须正确加或 balancer ,请使用小数 . 这包括人们可能手工完成的任何财务存储或计算,分数或其他数字 .
如果数字的确切值不重要,请使用双倍速度 . 这包括图形,物理或其他物理科学计算,其中已经存在“有效位数” .
我的问题是什么时候应该使用双倍,何时应该使用小数类型?
decimal 用于处理10 ^(/ -28)范围内的值,并且您对基于10基本表示的行为有所期望 - 基本上是金钱 .
decimal
double 当你需要相对准确度(即在大值上的尾随数字中丢失精度不是一个问题)时,差异很大 - double 覆盖超过10 ^(/ -300) . 科学计算是这里最好的例子 .
double
哪种类型适合货币计算?
十进制,十进制, decimal
不接受任何替代品 .
最重要的因素是 double ,实现为二进制分数,根本不能准确地表示许多分数(如0.1),其总位数较小,因为它是64位宽,而 decimal 是128位 . 最后,财务申请通常必须遵循具体的法律规定(有时由法律规定) . decimal supports these; double 没有 .
System.Single / float - 7位数System.Double / double - 15-16位数System.Decimal / decimal - 28-29有效数字
我使用错误的类型(好几年前)被蜇的方式是大量的:
£520,532.52 - 8位数
£1,323,523.12 - 9位数
你花了100万用于漂浮物 .
15位数的货币 Value :
9万亿双倍 . 但是通过划分和比较,它绝对不是浮点数和无理数的专家 - see Marc's point) . 混合小数和双精度会导致问题:
如果使用十进制数,则使用浮点数的数学运算或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数 .
When should I use double instead of decimal? 有一些类似且更深入的答案 .
使用 double 而不是 decimal 进行货币申请是一种微观优化 - 这是我看待它的最简单方法 .
十进制是精确值 . Double表示近似值 .
USD: $12,345.67 USD (Decimal) CAD: $13,617.27 (Decimal) Exchange Rate: 1.102932 (Double)
要钱: decimal . 它需要更多的内存,但没有像 double 那样的四舍五入的麻烦 .
绝对使用整数类型进行货币计算 . 这是不够强调的,因为乍一看似乎浮点类型就足够了 .
这是python代码中的一个例子:
>>> amount = float(100.00) # one hundred dollars >>> print amount 100.0 >>> new_amount = amount + 1 >>> print new_amount 101.0 >>> print new_amount - amount >>> 1.0
看起来很正常 .
现在用10 ^ 20津巴布韦元再试一次
>>> amount = float(1e20) >>> print amount 1e+20 >>> new_amount = amount + 1 >>> print new_amount 1e+20 >>> print new_amount-amount 0.0
如你所见,美元消失了 .
如果您使用整数类型,它可以正常工作:
>>> amount = int(1e20) >>> print amount 100000000000000000000 >>> new_amount = amount + 1 >>> print new_amount 100000000000000000001 >>> print new_amount - amount 1
我认为位宽旁边的主要区别是十进制有指数基数10而双数有2
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html
7 回答
为了钱, always 十进制 . 这就是它被创造的原因 .
如果数字必须正确加或 balancer ,请使用小数 . 这包括人们可能手工完成的任何财务存储或计算,分数或其他数字 .
如果数字的确切值不重要,请使用双倍速度 . 这包括图形,物理或其他物理科学计算,其中已经存在“有效位数” .
decimal
用于处理10 ^(/ -28)范围内的值,并且您对基于10基本表示的行为有所期望 - 基本上是金钱 .double
当你需要相对准确度(即在大值上的尾随数字中丢失精度不是一个问题)时,差异很大 -double
覆盖超过10 ^(/ -300) . 科学计算是这里最好的例子 .十进制,十进制, decimal
不接受任何替代品 .
最重要的因素是
double
,实现为二进制分数,根本不能准确地表示许多分数(如0.1),其总位数较小,因为它是64位宽,而decimal
是128位 . 最后,财务申请通常必须遵循具体的法律规定(有时由法律规定) .decimal
supports these;double
没有 .System.Single / float - 7位数
System.Double / double - 15-16位数
System.Decimal / decimal - 28-29有效数字
我使用错误的类型(好几年前)被蜇的方式是大量的:
£520,532.52 - 8位数
£1,323,523.12 - 9位数
你花了100万用于漂浮物 .
15位数的货币 Value :
9万亿双倍 . 但是通过划分和比较,它绝对不是浮点数和无理数的专家 - see Marc's point) . 混合小数和双精度会导致问题:
When should I use double instead of decimal? 有一些类似且更深入的答案 .
使用
double
而不是decimal
进行货币申请是一种微观优化 - 这是我看待它的最简单方法 .十进制是精确值 . Double表示近似值 .
要钱:
decimal
. 它需要更多的内存,但没有像double
那样的四舍五入的麻烦 .绝对使用整数类型进行货币计算 . 这是不够强调的,因为乍一看似乎浮点类型就足够了 .
这是python代码中的一个例子:
看起来很正常 .
现在用10 ^ 20津巴布韦元再试一次
如你所见,美元消失了 .
如果您使用整数类型,它可以正常工作:
我认为位宽旁边的主要区别是十进制有指数基数10而双数有2
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html