gpt4 book ai didi

iOS Float/Double 没有舍入

转载 作者:搜寻专家 更新时间:2023-11-01 05:40:54 25 4
gpt4 key购买 nike

好吧,我有一个非常愚蠢的问题。我需要将一个 float 分开两个:

  • 第一部分包含整数部分和小数点后两位数
  • 第二项应包含 float 的第三和第四位

重要的是我不想要任何四舍五入(无论是向上还是向下)。几乎是以下内容:

12.8 => 12.80 && 00
12.8999999999 => 12.89 && 99
12.899999 => 12.89 && 99
12.0005 => 12.00 && 05

格式字符串方法

无论如何我都需要小数点后 4 位数字,所以我需要使用 %.4f 或 %f(并去掉最后两个分量)来处理 12.8 => 12.8000。但是,当数字在小数点后有很多 9 时,会出现自动舍入:

let test = 122.899999999999
let sut = String(format: "%f", test) // 122.900000 instead of 122.899999

圆形方法

我尝试使用标准的 C floor 方法,因为它应该向下舍入我的 float 。但是,如果小数点后的 9 比我的“分隔线”大得多,则底线就像一个回合:

let test = 122.89999999999999

let divider = 10000.0

let sut = (Double(floor(test * divider)) / divider) // 122.9 instead of 122.8999

非常欢迎任何建议:)

最佳答案

不要使用 float ,float 不精确。使用 NSDecimalNumberNSDecimalNumber 类提供定点算术功能。它们旨在执行以 10 为基数的计算,而不会精度损失,并且具有可预测的舍入行为。这使得它成为表示货币的更好选择,而不是像 double 这样的 float 据类型。然而,代价是它们使用起来更复杂。

NSDecimalNumber *price1 = [[NSDecimalNumber alloc] initWithFloat:15.99f]] ;
NSDecimalNumber *price1 = [[NSDecimalNumber alloc] initWithFloat:29.99f]] ;
NSLog(@"Subtotal: %@", [price1 decimalNumberByAdding:price2]);

它将输出 45.98。

See this.

编辑:

这是关于 NSDecimalNumber 的苹果文档.

关于iOS Float/Double 没有舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30616177/

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