Swift 的 Decimal 精度问题

2024-04-16

根据文档here https://developer.apple.com/documentation/foundation/decimal, Swift 3/4 Decimal 类型是以 10 为基数桥接到 NSDecimalNumber 的表示形式。但是,我遇到了使用 NSDecimalNumber 时无法重现的精度问题。

let dec24 = Decimal(integerLiteral: 24)
let dec1 = Decimal(integerLiteral: 1)
let decResult = dec1/dec24*dec24 
// prints 0.99999999999999999999999999999999999984

let dn24 = NSDecimalNumber(value: 24)
let dn1 = NSDecimalNumber(value: 1)
let dnResult = dn1.dividing(by: dn24).multiplying(by: dn24)
// prints 1

Decimal 结构不应该准确吗,还是我误解了什么?


NSDecimalNumber(及其覆盖类型Decimal) 可以代表 https://developer.apple.com/documentation/foundation/nsdecimalnumber

...可以表示为的任何数字mantissa x 10^exponent where mantissa是一个最多 38 位长的十进制整数,并且exponent是 –128 到 127 之间的整数。

So 小数(最多38位小数)可以表示 确切地说,但不是任意数字。尤其1/24 = 0.416666666...有无限多个小数位(a重复小数 https://en.wikipedia.org/wiki/Repeating_decimal)并且不能是 精确地表示为Decimal.

之间也没有精度差异Decimal and NSDecimalNumber。如果我们打印差异,这一点就会变得明显 实际结果与“理论结果”之间:

let dec24 = Decimal(integerLiteral: 24)
let dec1 = Decimal(integerLiteral: 1)
let decResult = dec1/dec24*dec24

print(decResult - dec1)
// -0.00000000000000000000000000000000000016


let dn24 = NSDecimalNumber(value: 24)
let dn1 = NSDecimalNumber(value: 1)
let dnResult = dn1.dividing(by: dn24).multiplying(by: dn24)

print(dnResult.subtracting(dn1))
// -0.00000000000000000000000000000000000016
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 的 Decimal 精度问题 的相关文章

随机推荐

  • 为什么我们真的需要多个 Netty boss 线程?

    我真的很困惑老板组的线程数量 我无法弄清楚我们需要多个老板线程的场景 在Boss 组是否需要多个线程 https stackoverflow com questions 22280916 do we need more than a sin
  • F找出打开所有灯泡的最少开关数量

    我试图理解给出的问题here http qa geeksforgeeks org 4118 find the minimum number switches you have press turn all bulbs及其解决方案 问题指出
  • Laravel - 验证 |输入字段应该是两个值之一

    我正在尝试验证表单请求 并且我想接受该字段test如果它有一个值或ABC or XYZ 我怎样才能实现这个目标 我目前有 request gt validate test gt required unique tests Laravel 文
  • Spring RequestBodyAdvice 没有被模拟 MVC 框架工作,它如何为 ResponseBodyAdvice 工作

    我们正在使用 Spring 4 2 0 RELEASE 并实现RequestBodyAdvice and ResponseBodyAdvice解析请求和响应主体的建议 当我们尝试使用 spring 测试框架编写模拟单元测试时 它仅获取 Re
  • 即使所有消息都成功从服务器发送,某些设备也不会收到 GCM 推送

    我们正在开发一个使用 GCM 的应用程序 它在大多数手机上运行良好 但是 我们有两部手机 galaxy note 2 和 Galaxy s plus 收不到消息 或者可能只是广播接收器没有被调用 服务器端推送 data array data
  • 字符串中的智能模式匹配

    假设我的文件名格式不同 我希望能够像人类一样从所述文件名中提取某些方面 模式识别 显然 我可以使用正则表达式来暴力破解自己 但这不是我想要的 假设我有这 4 个字符串 MAS Hayate no Gotoku 20 BD 720p 21D1
  • 生成按 user_id 分组的订单表,其中汇总了产品数量

    我有一个大的 mysql 表 在 woocommerce 中 人们可以在其中多次购买商品 我想做的是动态生成一个表 在其中选择我想要查询的产品 如果可能的话 从 php 中的下拉菜单中 并按 user id 购买的产品数量进行分组 我发现t
  • 输入数据集如何输入神经网络?

    如果我的数据集中有 1000 个观测值 其中包含 15 个特征和 1 个标签 那么输入神经元中的数据如何用于前向传播和反向传播 是逐行馈送 1000 个观测值 一次一个 并根据每个观测值馈送更新权重 还是以输入矩阵形式给出完整数据 然后根据
  • 使用 python 将所有 csv 文件从编码 ansi 转换为 utf8

    我有Python代码如下 import os from os import listdir def find csv filenames path to dir suffix csv filenames listdir path to di
  • 如何在 rpy2 中将列表传递给 R 并返回结果

    我第一次尝试使用 rpy2 假设我在 python 中有一个列表 l 1 2 3 4 5 6 我想用 R 打电话 ks test l pexp 我怎样才能做到这一点 我最初的尝试是 usr bin python import rpy2 ro
  • Javascript 专注于 DIV 元素在 chrome 上不起作用

    您好 我想在页面加载后立即关注 div 它在 Firefox 上工作得很好 但在 chrome 上却不行 它不起作用 这是我的代码 https jsfiddle net 9yb2boxn https jsfiddle net 9yb2box
  • 使用 pandas 识别最近的物体

    我有一个可以使用任何编程语言完成的作业 我选择了Python和pandas 因为我几乎没有使用它们的经验 并且认为这将是一个很好的学习经历 我能够使用我从传统计算机编程中了解到的传统循环来完成作业 并且它在数千行上运行得很好 但是一旦我让它
  • 错误消息的顺序不正确

    在我的 Spring MVC 验证中 错误消息的顺序随机变化 我希望消息的顺序与页面上显示的顺序相同 我的 AccountForm java 类如下所示 NotNull message Account name cannot be empt
  • 目前不支持公式映射 - Hibernate ORM Envers

    我使用 Hibernate Envers Entity Table name user Audited class User private String id Formula SELECT name FROM other c where
  • & 后接 * 运算符的行为

    我对地址运算符后跟解引用运算符的行为有疑问 我们看一下表达式 p where p属于类型int C11 标准 第 6 5 3 2 节 规定 一元 运算符产生其操作数的地址 如果操作数的类型为 类型 结果的类型为 指向 类型 如果操作数是一元
  • mongodb C# 驱动程序中 InsertBatch 方法的最佳批量项目计数是多少?

    我听说大批量并不能真正提供任何额外的性能 什么是最优的 如果您调用 Insert 一次插入一个文档 则每个文档都会有一次网络往返 如果您调用 InsertBatch 批量插入文档 则每个批次 而不是每个文档 都会有一个网络往返 Insert
  • 在 RTC 中交付后如何丢弃更改集

    我意外地交付了更改集 其中包括一些在 RTC 中具有本地系统特定配置的附加配置文件 有没有办法在交付后放弃这些更改 我的意思是 这些变化不应该随着其他团队成员的变化而发生 如果有的话请提供任何指示 有没有办法在交付后放弃这些更改 不完全是
  • 添加Where 子句时会出现什么问题?

    我有一个简单的查询 Select Distinct BOLTYPENAME BOLTYPE BOLTYPE From BOLTYPE Inner Join WORKORDER on WORKORDER BOLTYPE BOLTYPE BOL
  • 根据javascript中深度嵌套对象中的值过滤数组

    我有具有以下结构的数组 var topics id 1 name topic title 1 sub categories id 1 name category title 1 indicators id 1 name indicator
  • Swift 的 Decimal 精度问题

    根据文档here https developer apple com documentation foundation decimal Swift 3 4 Decimal 类型是以 10 为基数桥接到 NSDecimalNumber 的表示