首页 文章

十进制vs双! - 我应该使用哪一个?何时使用? [重复]

提问于
浏览
787

这个问题在这里已有答案:

我一直看到人们在C#中使用双打 . 我知道我读到某个地方,双打有时会失去精确度 . 我的问题是什么时候应该使用双倍,何时应该使用小数类型?哪种类型适合货币计算? (即超过1亿美元)

7 回答

  • 35

    为了钱, always 十进制 . 这就是它被创造的原因 .

    如果数字必须正确加或 balancer ,请使用小数 . 这包括人们可能手工完成的任何财务存储或计算,分数或其他数字 .

    如果数字的确切值不重要,请使用双倍速度 . 这包括图形,物理或其他物理科学计算,其中已经存在“有效位数” .

  • 33

    我的问题是什么时候应该使用双倍,何时应该使用小数类型?

    decimal 用于处理10 ^(/ -28)范围内的值,并且您对基于10基本表示的行为有所期望 - 基本上是金钱 .

    double 当你需要相对准确度(即在大值上的尾随数字中丢失精度不是一个问题)时,差异很大 - double 覆盖超过10 ^(/ -300) . 科学计算是这里最好的例子 .

    哪种类型适合货币计算?

    十进制,十进制, decimal

    不接受任何替代品 .

    最重要的因素是 double ,实现为二进制分数,根本不能准确地表示许多分数(如0.1),其总位数较小,因为它是64位宽,而 decimal 是128位 . 最后,财务申请通常必须遵循具体的法律规定(有时由法律规定) . decimal supports these; double 没有 .

  • 160

    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 :

    • £1,234,567,890,123.45

    9万亿双倍 . 但是通过划分和比较,它绝对不是浮点数和无理数的专家 - see Marc's point) . 混合小数和双精度会导致问题:

    如果使用十进制数,则使用浮点数的数学运算或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数 .

    When should I use double instead of decimal? 有一些类似且更深入的答案 .

    使用 double 而不是 decimal 进行货币申请是一种微观优化 - 这是我看待它的最简单方法 .

  • 25

    十进制是精确值 . Double表示近似值 .

    USD: $12,345.67 USD (Decimal)
    CAD: $13,617.27 (Decimal)
    Exchange Rate: 1.102932 (Double)
    
  • 933

    要钱: decimal . 它需要更多的内存,但没有像 double 那样的四舍五入的麻烦 .

  • 6

    绝对使用整数类型进行货币计算 . 这是不够强调的,因为乍一看似乎浮点类型就足够了 .

    这是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
    
  • 5

    我认为位宽旁边的主要区别是十进制有指数基数10而双数有2

    http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html

相关问题