web-dev-qa-db-ja.com

Swiftで小数をx桁に切り捨てる方法

私のSwiftプログラムでは、10進数が非常に長く(たとえば、17.9384693864596069567)あり、小数点以下の桁数を切り捨てたい(したがって、出力を17.9384にしたい)。 not数値を17.9385に丸めたいのですが、どうすればよいですか?

助けていただければ幸いです!

注:これらの関数のいくつかが作成される前は、非常に古いバージョンのSwiftを使用しているため、これは重複ではありません。また、彼らは浮動小数点数と整数を使用していますが、私は倍数について話しています。そして、彼らの質問/回答ははるかに複雑です。

11
owlswipe

Doubleの拡張子にすることで、これをさらに整理できます。

extension Double
{
    func truncate(places : Int)-> Double
    {
        return Double(floor(pow(10.0, Double(places)) * self)/pow(10.0, Double(places)))
    }
}

そしてあなたはこのようにそれを使います

var num = 1.23456789
// return the number truncated to 2 places
print(num.truncate(places: 2))

// return the number truncated to 6 places
print(num.truncate(places: 6))
27
Russell

小数の後の特定の数字のコードは次のとおりです。

let number = 17.9384693864596069567;
let merichle = Float(String(format: "%.1f", (number * 10000)).dropLast(2))!/10000

//merichle = 17.9384

そして最終的に、あなたの数は丸めずに切り捨てられます...

4
Ramazan Karami

私はこれを理解しました。

数字を切り捨てる(切り捨て)だけでなく、いくつかの手の込んだトリックも行います。

let x = 1.23556789
let y = Double(floor(10000*x)/10000) // leaves on first four decimal places
let z = Double(floor(1000*x)/1000) // leaves on first three decimal places
print(y) // 1.2355
print(z) // 1.235

したがって、1を乗算し、0の数を小数点以下の桁数にして、それをフロアし、乗算した値で除算します。そして出来上がり。

3
owlswipe

SwiftUI:ビューで出力をフォーマットするために切り捨てるが、計算ではない場合、SwiftUIには、Text()のシグニチャーの一部としてCフォーマット指定子を使用する便利な方法が含まれています。

import SwiftUI

let myDouble = 17.93846938645960695
Text("\(myDouble, specifier: "%.2f")")
///Device display: 17.94

上記のコードは、Doubleのコンテンツを直接ビューに出力し、100番目の桁に正しく丸めますが、Doubleの値は以降の計算のために保持します。

SwiftUIのユーザーとして、C言語のフォーマット指定子に慣れていない場合、このリンクには役立つ情報が含まれています。 https://en.wikipedia.org/wiki/Printf_format_string

0
Alex Moore

ドラッグアンドドロップソリューション、IOS、Swift 4

このコードをアプリケーションにコピーします...

import Foundation

func truncateDigitsAfterDecimal(number: Double, afterDecimalDigits: Int) -> Double {
   if afterDecimalDigits < 1 || afterDecimalDigits > 512 {return 0.0}
   return Double(String(format: "%.\(afterDecimalDigits)f", number))!
}

次に、この関数を次のように呼び出すことができます。

truncateDigitsAfterDecimal(number: 45.123456789, afterDecimalDigits: 3)

以下を生成します:

45.123
0
Duane Baerwaldt
extension Double {
    /// Rounds the double to decimal places value
    func roundToPlaces(_ places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
    func cutOffDecimalsAfter(_ places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self*divisor).rounded(.towardZero) / divisor
    }
}

let a:Double = 1.228923598

print(a.roundToPlaces(2)) // 1.23
print(a.cutOfDecimalsAfter(2)) // 1.22
0
Prcela