2011-11-22 9 views
8

私はROUNDの関数をC#とSQLから使用していますが、驚くべきことに両方とも異なる結果をもたらしています。 SQLでなぜC#ラウンド関数とSQLラウンド関数が異なる出力をもたらすのですか?

:ラウンドとC#のROUND 1250ROUND(1250.00, -2) = 1300

precision = 2 = 1200

は、誰もが前にこのような状況に出くわしていますか?

+0

どのデータベース・サーバを使用しています? – Baz1nga

+0

これは、すべての言語が数字を丸める方法です。あなたの真ん中で立ち往生しているときは、あなたのSQLは明らかにUPとC#が丸められます。 ROUND以外のものを使うことをお勧めします。 SQLの天井は切り上げられますが、何をしようとしているかについての情報がなければ、何を使用するかについてアドバイスすることは本当に不可能です。 –

+0

明確にするために、C#は数字を丸めません。 .NET BCLはそうです。 –

答えて

7

C#は、デフォルトでバンカーの丸めを使用しています。ここでは、.5マークが正確にあるとき、常に切り上げるのではなく、最も近い偶数に丸めます。

msdn articleの備考のセクションでこの現象が説明されています。基本的には、丸められた数字を一緒にたくさん集めると丸め誤差を減らすことです。

0

数値を丸める方法を指定するには、Math.RoundのパラメータMidpointRoundingを使用します。

public enum MidpointRounding 
{ 
    // When a number is halfway between two others, it is rounded toward 
    // the nearest even number. 
    ToEven = 0, 

    // When a number is halfway between two others, it is rounded toward 
    // the nearest number that is away from zero. 
    AwayFromZero = 1, 
} 

あなたはそれをこのように使用することができます。

int presicion = 2; 
double valueToRound; 

Math.Round(valueToRound/Math.Pow(10, precision), MidpointRounding.AwayFromZero) 
    * Math.Pow(10, precision); 
+0

私はこのパラメータを試しましたが、使用しませんでした。まだ同じ結果が得られています: –

1

丸めで難しい部分は、小数点で5つのをどうするかです。彼らは実際にはちょうど途中ですので、彼らはネクタイを構成します。ウィキペディアの丸め記事には、tie-breakingについての良いビットがあります。本質的に、C#はバンカーの丸めを使用します。丸めは、最後の丸められた桁が偶数の場合は切り捨てられ、奇数の場合は上になります。これは、IEEE標準に準拠しています。代わりにSQLは「常にラウンド5を上げる」ルールに従います。

3

あなたがhttp://msdn.microsoft.com/en-us/library/wyk4d9cy.aspxを読めば、あなたはSQL Serverの が

更新SQL Serverのいずれかが対称をして丸め、「標準」を使用しているように見えるように、デフォルトの丸め(バンカーの丸め)「にも、ラウンド」であることがわかります算術丸めまたは対称ラウンドダウン(修)引数の問題を解決する方法

に応じて:カスタム丸め手順を実装します。あなたはhttp://support.microsoft.com/default.aspx?scid=KB;EN-US;Q196652&ID=KB;EN-US;Q196652

+0

サポートリンクはもう動作しません SQL [ここ](http://blogs.lessthandot.com/index.php/datamgmt/datadesign/sql)にバンカーの丸めの実装があります-server-rounding-methods /) –

関連する問題