在分割存盤在變數中的浮點數與僅使用該值時,我在 SQL Server 中遇到了這個奇怪的問題。
案例如下:
DECLARE @FLOAT FLOAT = 6.80
print ROUND(@FLOAT / 2, 2, 0);
print ROUND(@FLOAT / 2, 2, 1);
它列印:
3.4
3.39
截斷值的第二個 ROUND 給出了錯誤的值。它應該是 3.4 而不是 3.39。
但是當我使用沒有變數的值時,它可以正常作業:
print ROUND(6.80 / 2, 2, 0);
print ROUND(6.80 / 2, 2, 1);
它列印:
3.400000
3.400000
有人能幫我理解這個問題嗎?提前致謝。
uj5u.com熱心網友回復:
這種行為是意料之中的。在第一個運算式中,您使用的是 a float,而在后一個字面量中decimal。這兩種資料型別非常不同。前者是 Base 2 值,后者是 Base 10。
6.80 不能使用 Base 2 精確存盤,因此它的實際值更接近 value 6.79999999999999982236431605997495353221893310546875。正如您所看到的,這總是比稍小6.8,因此當您將該數字除以 時2,您會得到一個比 稍小的數字3.40,很可能3.399999999999999911182158029987476766109466552734375。
結果ROUND是正確四舍五入,因為上述四舍五入為 2 位的值 3.39 不是 3.40。
對于文字,6.80精確表示,因此6.80 / 2( 3.40) 因此當您再次將該數字四舍五入到小數點后 2 位時,您仍然會得到3.40
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379308.html
標籤:sql sql-server 浮点 四舍五入
