使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?

Posted

技术标签:

【中文标题】使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?【英文标题】:How to get rounded value without fraction error when using numberFromString to generate NSDecimalNumber? 【发布时间】:2016-02-02 10:23:35 【问题描述】:

我正在尝试从字符串中解析出NSDecimalNumber,但是无论我在 numberFormatter 上设置什么属性,在获取numberFromString 时,我都无法让它停止出现小数错误

let numberFormatter = NSNumberFormatter()
numberFormatter.maximumFractionDigits = 1
numberFormatter.decimalSeparator = "."
numberFormatter.generatesDecimalNumbers = true
numberFormatter.roundingMode = .RoundDown
numberFormatter.roundingIncrement = 0.01
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString("93.9")

数字设置为 93.9000000000001,而不是 93.9。如何让它为数字设置正确的值?

【问题讨论】:

你如何记录/观察这个值? 检查和操场 【参考方案1】:

NSDecimalNumber 上定义了一个工厂方法,它接受一个字符串:

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString

例子:

$ swift
Welcome to Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81). Type :help for assistance.
  1> import Foundation
  2> NSDecimalNumber(string: "93.9")
$R0: NSDecimalNumber = 93.9
  3>

【讨论】:

但这仍然给你 93.09999999999999 我的意思是 93.90000000000001 代表 93.9。以上评论是针对 93.1【参考方案2】:

将最后一行替换为

let number = numberFormatter.numberFromString("93.7")?.floatValue

【讨论】:

但是我不会得到 NSDecimalNumber

以上是关于使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?的主要内容,如果未能解决你的问题,请参考以下文章

NSNumberFormatter numberFromString 为货币样式格式化程序返回 0

html NS:PDF生成器模板

NSSearchPathForDirectoriesInDomains用法

java dom4j生成有前缀节点的 xml,节点类似soapenv:Envelope模样

删除 XSLT 映射生成的元素的名称空间前缀

NSSearchPathForDirectoriesInDomains