以swift格式将十进制设置为字符串,并正确舍入

以swift格式将十进制设置为字符串,并正确舍入,swift,Swift,我一直在使用以下方法将小数格式化为字符串: NSString(格式:“%\(0.2)f”,十进制) 然而,我注意到一些奇怪的事情,1.025循环到1.02,其中as1.026循环到1.03。这是正确的行为吗 我记得在数学课上,我们总是在.5。这是我从未注意到的预期行为吗?还是有更好的方法来做到这一点 NIST四舍五入规则如下:() B.7.2数量的四舍五入转换数值 使用秒中给出的系数。B.8和B.9转换的值 数量以秒表示。B.3。在大多数情况下 未转换的数值和系数将是一个数值 位数超过有效位数

我一直在使用以下方法将小数格式化为字符串:

NSString(格式:“%\(0.2)f”,十进制)

然而,我注意到一些奇怪的事情,
1.025
循环到
1.02
,其中as
1.026
循环到
1.03
。这是正确的行为吗

我记得在数学课上,我们总是在
.5
。这是我从未注意到的预期行为吗?还是有更好的方法来做到这一点

NIST四舍五入规则如下:()

B.7.2数量的四舍五入转换数值

使用秒中给出的系数。B.8和B.9转换的值 数量以秒表示。B.3。在大多数情况下 未转换的数值和系数将是一个数值 位数超过有效位数的值 未转换数值的位数(见第7.9节)。适当的 转换过程需要将转换后的数值舍入 到与 未转换数值的最大可能舍入误差

示例:要表示l=36 ftin米的值,请使用系数 3.048 E-01来自第。B.8或秒。B.9和写作

l=36英尺×0.3048米/英尺=10.9728米=11.0米。最后的结果,l= 11.0 m,基于以下推理:数值“36”有两个有效数字,因此可能存在相对最大值 为简便起见,舍入误差(本指南中缩写为RE)为± 0.5/36=±1.4%,因为它可能是由数字35.5、36.5或35.5和36.5之间的任何数字四舍五入产生的。成为 与此RE一致,转换后的数值“10.9728”为 四舍五入为11.0或三位有效数字,因为数字为11.0 RE为±0.05/11.0=±0.45%。虽然这±0.45%的RE是 未转换数值“36”的±1.4%RE的三分之一 如果转换后的数值“10.9728”已四舍五入为11或 两个有效数字,包含在未转换的 数值“36”将丢失。这是因为 数值“11”为±0.5/11=±4.5%,为三倍 未转换数值“36”的±1.4%RE。此示例 因此,当选择要保留的位数时 必须经常选择的换算数量的数值 在丢弃信息或提供不必要的信息之间。 考虑转换值的最终用途通常会有帮助 决定要做的选择

注:考虑最初被告知值L=36。 英尺已四舍五入到最接近的英寸。那么在这种情况下,因为我是 已知在±1英寸范围内,数值“36”的RE为±1英寸 英寸/(36英尺×12英寸/英尺)=±0.23%。虽然这小于± 数值11.0的0.45%,与之相当。因此,结果l=11.0 m仍然作为转换值给出。(注意 数值“10.97”将给出过多的不必要信息 信息,因为其RE为±0.23%的五分之一。)


格式应该是
“%0.2f”
,没有字符串插值。真正的问题是数字1.025不能精确表示为二进制浮点数,因此
a
可能略小于1.025。我相信这个问题在以前的某个地方已经得到了回答。你的例子与你的截图不匹配,也无助于让问题变得非常清楚…@MartinR yep,请核对。1.025实际上是1.024999976158142,因此即使格式正确设置为“%0.2f”,它也会四舍五入为1.02。@Jeef最好在可以配置的地方使用。