gpt4 book ai didi

ios - NSDecimalNumber的数学完整性

转载 作者:行者123 更新时间:2023-12-01 19:46:23 28 4
gpt4 key购买 nike

我正在使用数字除以10 ^ 30

我可能会添加存储在NSDecimalNumber s中的值1000000000000000和5000000000000000。

我担心的是,我想过几次,在添加或减去这些值时,数学运算不正确。

就其数学的完整性而言,这是否可行,或者NSDecimalNumbers很不错。

最佳答案

在回答您的问题时,Decimal / NSDecimalNumber提供的数学是正确的,问题可能出在以下任一方面:

  • 计算可能超出了这些十进制格式的容量(如rob mayoff概述)。例如,之所以可行,是因为我们位于38位尾数内:
    let x = Decimal(sign: .plus, exponent: 60, significand: 1)
    let y = Decimal(sign: .plus, exponent: 30, significand: 1)
    let z = x + y

    1,000,000,000,000,000,000,000,000,000,001,000,000,000,000,000,000,000,000,000,000,000,000

    但这不会:
    let x = Decimal(sign: .plus, exponent: 60, significand: 1)
    let y = Decimal(sign: .plus, exponent: 10, significand: 1)
    let z = x + y

    1,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
  • 或者,可能就是您实例化这些十进制值的方式,例如提供浮点数,而不是使用Decimal(sign:exponent:significand:)NSDecimalNumber(mantissa:exponent:isNegative:)初始化程序:

    例如,这可以正常工作:
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal

    let x = Decimal(sign: .plus, exponent: 30, significand: 1)
    print(formatter.string(for: x)!)

    结果是:

    1,000,000,000,000,000,000,000,000,000,000

    但是这些不会,因为您提供的浮点数的精度受到较低的限制:
    let y = Decimal(1.0e30)
    print(formatter.string(for: y)!)

    let z = Decimal(1_000_000_000_000_000_000_000_000_000_000.0)
    print(formatter.string(for: z)!)

    这些都导致:

    1,000,000,000,000,000,409,600,000,000,000

  • 有关浮点运算的更多信息(以及为什么肯定不能在浮点类型中完美捕获十进制数),请参见 floating-point arithmetic

    your other question中,您询问以下原因:
    let foo = NSDecimalNumber(value: 334.99999).multiplying(byPowerOf10: 30)

    生产:

    334999990000000051200000000000000

    这是我在上文第2点中概述的基本问题。浮点数不能准确表示某些十进制值。

    注意,您的问题与以下 Decimal格式相同:
    let adjustment = Decimal(sign: .plus, exponent: 30, significand: 1)
    let foo = Decimal(334.99999) * adjustment

    这还会产生:

    334999990000000051200000000000000

    但是,如果您提供字符串或指数且尾数/有效位,则将获得所需的结果,因为它们将被准确地表示为 Decimal / NSDecimalNumber:
    let bar = Decimal(string: "334.99999")! * adjustment
    let baz = Decimal(sign: .plus, exponent: -5, significand: 33499999) * adjustment

    这些都产生:

    334999990000000000000000000000000000000

    底线,不要为 DecimalNSDecimalNumber提供浮点数。使用字符串表示形式或指数和尾数/有效位数表示形式,使用浮点数时不会出现这些奇怪的偏差。

    关于ios - NSDecimalNumber的数学完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48308639/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com