uint64Value
является свойством NSNumber
, и оно недостаточно документировано применительно к NSDecimalNumber
.
Но, насколько я тестировал, когда часть мантиссы превышает диапазон UInt64
возвращает 0
.Например, 31.5411764705882352941176470588235294116
представляется как 315411764705882352941176470588235294116 × 10 ^ (- 38) в NSDecimalNumber
, а 315411764705882352941176470588235294116
больше UInt64.max
.(* 1)
Чтобы избежать такого поведения (* 2), вы можете округлить десятичное значение перед преобразованием его в UInt64
.
func number(for cof: UInt8, limit: UInt64) -> UInt64 {
var decimalResult = (1 + Decimal(cof)/255) * Decimal(limit) / 1000
var roundedResult = Decimal()
NSDecimalRound(&roundedResult, &decimalResult, 0, NSDecimalNumber.RoundingMode.plain)
return NSDecimalNumber(decimal: roundedResult).uint64Value
}
print(number(for: 128, limit: 21000)) //->32
(* 1) Actualповедение кажется немного более сложным, см. более короткие примеры в комментарии Мартина Р.
(* 2) Это поведение определенно является ошибкой, однажды помеченной как RESOLVED.Смотрите также другой комментарий Мартина Р. выше.