Swift

Swift:浮動小数点の盲点

あらま!var wFloat5:Float = 2.1 – 2の実行結果は?

小数点以下が0でないときエラーにしたかったので、整数を引けばいいだろうと思っていたら、意外なことにvar wFloat5:Float = 2.1 – 2の結果が0.0999999であることを発見。やれやれという気分になってしまいました。

それで、var wFloat3:Float = ceilf(wFloat) – floor(wFloat)のように切り上げ・切り下げをして0か否かで判定しないといけないことがわかりました。

サンプルプログラム:

var wValue:String   = “2.1123456789012345”
var wFloat:Float    = (wValue as NSString).floatValue
var wDouble:Double  = (wValue as NSString).doubleValue

println(“\(wNo++). wFloat=\(wFloat)  切り捨てfloorf(wFloat)=\(floorf(wFloat))  切り上げceilf(wFloat)=\(ceilf(wFloat)) 四捨五入roundf(wFloat)=\(roundf(wFloat))”)

println(“\(wNo++). wDouble=\(wDouble)  切り捨てfloor(wDouble)=\(floor(wDouble))  切り上げceil(wDouble)=\(ceil(wDouble)) 四捨五入round(wDouble)=\(round(wDouble))”)

var wFloat3:Float   = ceilf(wFloat) – floor(wFloat)
println(“\(wNo++). wFloat3=\(wFloat3)”)
var wFloat4:Double   = 2.1 – 2
println(“\(wNo++). wFloat4=\(wFloat4)”)
var wFloat5:Float   = 2.1 – 2
println(“\(wNo++). wFloat5=\(wFloat5)”)

1. wFloat=2.11235

  • 切り捨てfloorf(wFloat)=2.0
  • 切り上げceilf(wFloat)=3.0
  • 四捨五入roundf(wFloat)=2.0

2. wDouble=2.11234567890123

  • 切り捨てfloor(wDouble)=2.0
  • 切り上げceil(wDouble)=3.0
  • 四捨五入round(wDouble)=2.0

3. wFloat3=1.0

4. wFloat4=0.1

5. wFloat5=0.0999999

参考:小数点の切り捨て、切り上げ、四捨五入

Categories: Swift, 技術