小数の切り捨てFLOORの挙動


以下はSQLServerで扱っているデータです｡  
SET @Value = (0.2 +4.3+5.1+4.3+9.9+0.5+0.5)  
とした場合､@Valueの値は2.480000000000000e+002となっています｡

この値に100を掛ける､  
FLOOR(@Value)とする  
@Valueを100で割り戻す

となぜか､  
2.470000000000000e+002となってしまいます｡  
なぜ､値が減るのか､どうしてもわかりません｡

どなたか､ご教授お願いします｡




切り捨て誤差の影響によるものです。

2.48を2進数で表現すると、0000 0010 . 0111 1010 1110 0001 0100 0111...  
となります。 ここでは、小数点以下24桁まで書いてありますが、循環小数なのでずっと永遠に続きます。  
これは、1/3を10進数で表現すると、0.33333333...と永遠に続くのと同様です。

計算機で表現できる桁数（ビット数）には限りがありますから、どこかの桁より先は切り捨てられます。

小数点以下25桁目以降を切り捨てた 0000 0010 . 0111 1010 1110 0001 0100
0111を10進数に戻すと、2.479999959468841552734375にしかなりません。

これを100倍すると、247.9999959468841552734375。  
Floor(247.9999959468841552734375)は247となります。

このように、値を表現するのに使える桁数に限度があるために、下位の桁が切り捨てられて実際よりも小さな値になることを「切り捨て」による「誤差」と言います。

電卓で、100÷3を計算し、それに3を掛けても100にならない（99.999999....になってしまい、小数点より上を見ると99にしかならない）というのも、同様に切り捨て誤差によるものです。

＝＝  
補足：  
0.2
+4.3+5.1+4.3+9.9+0.5+0.5=24.8ですので、@valueの値は0.2480000000000000e+002もしくは2.480000000000000e+001、が正しいと思います。  
上記の説明は、2.480000000000000e+001を想定して書いてあります。




切り捨て誤差の影響によるものです。

2.48を2進数で表現すると、0000 0010 . 0111 1010 1110 0001 0100 0111...  
となります。 ここでは、小数点以下24桁まで書いてありますが、循環小数なのでずっと永遠に続きます。  
これは、1/3を10進数で表現すると、0.33333333...と永遠に続くのと同様です。

計算機で表現できる桁数（ビット数）には限りがありますから、どこかの桁より先は切り捨てられます。

小数点以下25桁目以降を切り捨てた 0000 0010 . 0111 1010 1110 0001 0100
0111を10進数に戻すと、2.479999959468841552734375にしかなりません。

これを100倍すると、247.9999959468841552734375。  
Floor(247.9999959468841552734375)は247となります。

このように、値を表現するのに使える桁数に限度があるために、下位の桁が切り捨てられて実際よりも小さな値になることを「切り捨て」による「誤差」と言います。

電卓で、100÷3を計算し、それに3を掛けても100にならない（99.999999....になってしまい、小数点より上を見ると99にしかならない）というのも、同様に切り捨て誤差によるものです。

＝＝  
補足：  
0.2
+4.3+5.1+4.3+9.9+0.5+0.5=24.8ですので、@valueの値は0.2480000000000000e+002もしくは2.480000000000000e+001、が正しいと思います。  
上記の説明は、2.480000000000000e+001を想定して書いてあります。

