私のSwiftプログラムでは、10進数が非常に長く(たとえば、17.9384693864596069567
)あり、小数点以下の桁数を切り捨てたい(したがって、出力を17.9384
にしたい)。 not数値を17.9385
に丸めたいのですが、どうすればよいですか?
助けていただければ幸いです!
注:これらの関数のいくつかが作成される前は、非常に古いバージョンのSwiftを使用しているため、これは重複ではありません。また、彼らは浮動小数点数と整数を使用していますが、私は倍数について話しています。そして、彼らの質問/回答ははるかに複雑です。
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))
小数の後の特定の数字のコードは次のとおりです。
let number = 17.9384693864596069567;
let merichle = Float(String(format: "%.1f", (number * 10000)).dropLast(2))!/10000
//merichle = 17.9384
そして最終的に、あなたの数は丸めずに切り捨てられます...
私はこれを理解しました。
数字を切り捨てる(切り捨て)だけでなく、いくつかの手の込んだトリックも行います。
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の数を小数点以下の桁数にして、それをフロアし、乗算した値で除算します。そして出来上がり。
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
このコードをアプリケーションにコピーします...
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
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