【问题标题】:Get string from float without rounding its value从浮点数中获取字符串而不对其值进行四舍五入
【发布时间】:2018-03-08 11:58:00
【问题描述】:

我面临一种情况,我只需要浮点数的小数点后 2 位而不对其实际值进行四舍五入。

我尝试了以下代码行:

extension Float {

func stringWith2Decimals() -> String {
    return String(format: "%.2f", self)
  }
}

这给了我以下输出:

var floatValue = 10.99999999 

输出:11.00

预期结果:10.99

请告诉我你的想法。

【问题讨论】:

标签: ios swift floating-point


【解决方案1】:

这对你有帮助,我已经测试过了。

let floatValue = 10.99999999
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.roundingMode = .down
let s = formatter.string(from: NSNumber(value: floatValue))
print(s)

更新了的答案还有一个值 10.9 的情况,它应该显示 10.90。

案例 1:当您只想打印实际的十进制数字或最多 2 个十进制数字时

 let floatValue = 10.999999
    let floatValue1 = 10
    let floatValue2 = 10.9
    let floatValue3 = 10.91


    let formatter = NumberFormatter()
    formatter.minimumFractionDigits = 0
    formatter.maximumFractionDigits = 2
    formatter.roundingMode = .down
    let s = formatter.string(from: NSNumber(value: floatValue))
    print(s!)  // 10.99
    let s1 = formatter.string(from: NSNumber(value: floatValue1))
    print(s1!)  // 10
    let s2 = formatter.string(from: NSNumber(value: floatValue2))
    print(s2!)  // 10.9
    let s3 = formatter.string(from: NSNumber(value: floatValue3))
    print(s3!)  // 10.91

案例 2: 当您总是想打印两位小数时。

 let floatValue = 10.999999
    let floatValue1 = 10
    let floatValue2 = 10.9
    let floatValue3 = 10.91


    let formatter = NumberFormatter()
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    formatter.roundingMode = .down
    let s = formatter.string(from: NSNumber(value: floatValue))
    print(s!) // 10.99
    let s1 = formatter.string(from: NSNumber(value: floatValue1))
    print(s1!) // 10.00
    let s2 = formatter.string(from: NSNumber(value: floatValue2))
    print(s2!) // 10.90
    let s3 = formatter.string(from: NSNumber(value: floatValue3))
    print(s3!) // 10.91

希望你得到你想要的。如果是,请投票,否则请告诉我您的实际要求是什么。

更新了问题的答案。 对于像 10.9999999999999999 这样的值,它的印刷是 11.00,而不是 10.99。

  let floatValue3 = 10.99999999999999
    let (wholePart, fractionalPart) = modf(floatValue3)
    let stringFractionalPart = "\(fractionalPart)"
    let stringWholePart = "\(Int(wholePart))"

    let aryFractionalPart = stringFractionalPart.components(separatedBy: ".")

    var valueToDisplay = stringWholePart

    if aryFractionalPart.count >= 2 {
        let decimalDigits = aryFractionalPart[1]
        let digit2 = decimalDigits.prefix(2)
        valueToDisplay = "\(valueToDisplay).\(digit2)"
    }

    print(valueToDisplay)

现在希望我能满足你的要求。

【讨论】:

  • 完美答案。
  • @KaramjeetSingh 还有一种情况,其值为 10.9,它应该显示为 10.90。正确的做法是什么?
  • @JarvisTheAvenger 请检查我已更新的答案。或多或少你必须玩最大/最小 FractionDigits
  • @KaramjeetSingh 会尝试让您知道。
  • @KaramjeetSingh 的值如 10.9999999999999999 其印刷 11.00,而不是 10.99。我不想在其中进行任何舍入。似乎格式化程序正在舍入值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多