我试图在swift中分隔double的十进制和整数部分.我尝试了很多方法,但它们都遇到了同样的问题......
let x:Double = 1234.5678
let n1:Double = x % 1.0 // n1 = 0.567800000000034
let n2:Double = x - 1234.0 // same result
let n3:Double = modf(x, &integer) // same result
Run Code Online (Sandbox Code Playgroud)
有没有办法获得0.5678而不是0.567800000000034而无需将数字转换为字符串?
我们在业务逻辑中发现了一个有趣的案例,它完全打破了我们的逻辑,我们不明白为什么NSDecimalNumber,也不Decimal知道它的行为方式。
我的案例游乐场如下:
import Foundation
let pQuantity = Decimal(string: "0.2857142857142857")!
let pPrice = Decimal(string: "7.00000000000000035")!
let calced = NSDecimalNumber(decimal: pQuantity * pPrice * Decimal(integerLiteral: 100)) // 200
let decimal = calced.decimalValue // 199.9999999999999999999999999999995
let integer = calced.intValue // 0
NSDecimalNumber(decimal: Decimal(string: "199.9999999999999999999999999999995")!).intValue // 0
NSDecimalNumber(decimal: Decimal(string: "199.9999999999999995")!).intValue // 199
NSDecimalNumber(decimal: Decimal(string: "199.99999999999999995")!).intValue // 15
NSDecimalNumber(decimal: Decimal(string: "199.999999999999999995")!).intValue // -2
Run Code Online (Sandbox Code Playgroud)
在上面的游乐场代码中,如果您不想自己运行它,则如果向右滚动,您可以看到返回值。
在计算将这些数量平均分配多少以产生美观的价格时,我们需要将原始小数值、数量和价格暂时转换为整数。然而,在这种情况下,由于某种原因,我们不能,因为转换的初始步骤失败,产生一个0而不是200(是的,当前的代码会产生199一个错误)。
为什么 NSDecimalNumber 根据小数位数(范围从-2到 )返回这些奇怪的值199?
我们的解决方案是在将内部计算放入 之前对其进行四舍五入 …
我有一种情况,我得到一个NSDecimal,我需要一个NSInteger.我知道它是一个非常小的值(这是绝对肯定的).它不会大于100.所以将它转换为NSInteger是完全没问题的,不会发生溢出.
怎么可以这样做?在NSDecimal中只有一个-doubleValue方法.