2

このSQLステートメントをOracle11gデータベースで実行します

select round(79/3 + 87/3 + 86/6 + 95/6) from dual

そしてそれは戻ります85

select round(79/3 + 87/3 + 86/6 + 95/6,1) from dual

戻り値85.5

select round(85.5) from dual

正しい値を返します86

86最初のSQLステートメントが正しい値を返さないのに、それを切り捨てる理由を誰かが知っています85か?

4

3 に答える 3

10

もし、するなら:

select 79/3 + 87/3 + 86/6 + 95/6 from dual;

Oracleはを返します85.49999999999999999999999999999999999999。小数点以下0桁に丸めると、実際には85になります。これは浮動小数点演算のアーティファクトです。

于 2012-07-09T15:37:15.300 に答える
1

79/3 + 87/3 + 86/6 + 95/6は、IEEE754の丸め動作を持たない浮動小数点演算を返します。NumberとFloatの違いについてはこちらをご覧ください。

正しい結果を取り戻すには、次のようにステートメントを実行する必要があります。

select round(to_number(79/3 + 87/3 + 86/6 + 95/6)) from dual;
于 2012-07-09T22:43:20.933 に答える
-1

不思議な精度の低下のようです。

SELECT 79/3 + 87/3 + 86/6 + 95/6 FROM DUAL

85.49999999999999999999999999999999999999

明らかに、85.4は85に丸められます。この場合、Oracleが精度を失う理由については、よくわかりません。

于 2012-07-09T15:40:56.003 に答える