String(format: "%.2f")
の引数として0を渡していますが、予想通りiPhone 5s、se、6,6sなどで動作します。 5では、%f
は64ビットの浮動小数点数をフォーマットするので、32ビットと64ビットのシステムの問題であると推測しました。 Double(0)
で0をラップしたところ、結果は0.00でした。%%2!のフォーマットでIntがiPhone 5で予期しない数値を返す
誰かが詳細を説明できますか?
String(format: "%.2f")
の引数として0を渡していますが、予想通りiPhone 5s、se、6,6sなどで動作します。 5では、%f
は64ビットの浮動小数点数をフォーマットするので、32ビットと64ビットのシステムの問題であると推測しました。 Double(0)
で0をラップしたところ、結果は0.00でした。%%2!のフォーマットでIntがiPhone 5で予期しない数値を返す
誰かが詳細を説明できますか?
String(format:)
は、(オブジェクトの%@
ようないくつかの追加を伴う) printf
と同じ変換仕様を使用します。特に、%f
変換は、引数リストにDouble
、および未定義の動作を引き起こし他 何かを渡すを期待:それは予期しない 出力またはクラッシュを生成することができます。 64ビットプラットフォームで
、次いで Int
は64ビット整数であり、したがって、Double
と同じ大きさを有しているため0
が偶然によってに動作することができる渡します。 でも、それは動作することが保証されていません: 浮動小数点の 浮動小数点数の代わりに整数の引数を渡しても未定義の動作です。
あなたはより一貫性のある動作のために迅速な作り付けの方法を使用することができます
// Round the given value to a specified number
// of decimal places
func round(_ value: Double, toDecimalPlaces places: Int) -> Double {
let divisor = pow(10.0, Double(places))
return round(value * divisor)/divisor
}
例:
ラウンド(52.3761、toDecimalPlaces:3)// 52.376
がラウンド(52.3761、toDecimalPlaces:2 )// 52.38