SQL Server の小数点以下の桁を切り捨てる (四捨五入しない)
-
09-06-2019 - |
質問
SQLで四捨五入せずに余分な小数点以下の桁を切り捨てまたは削除する最良の方法を決定しようとしています。例えば:
declare @value decimal(18,2)
set @value = 123.456
これは自動的に丸められます @value
することが 123.46
, ほとんどの場合、これで問題ありません。ただし、このプロジェクトではその必要はありません。不要な小数点を切り捨てる簡単な方法はありますか?を使用できることはわかっています left()
関数を実行し、10 進数に変換し直します。他に方法はありますか?
解決
select round(123.456, 2, 1)
他のヒント
ROUND ( 123.456 , 2 , 1 )
3番目のパラメータのとき != 0 丸めるのではなく切り捨てる
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
構文
ROUND ( 数値式 , 長さ [ ,関数 ] )
引数
数値式ビットデータ型を除き、正確な数値または数値データ型カテゴリの式です。
長さnumeric_expression が丸められる精度です。length は、tinyint、smallint、または int 型の式である必要があります。length が正の数の場合、numeric_expression は length で指定された小数点以下の桁数に丸められます。length が負の数の場合、numeric_expression は length で指定されたとおりに小数点の左側で丸められます。
- 関数実行する操作のタイプです。関数は tinyint、smallint、または int である必要があります。function が省略されている場合、または値が 0 (デフォルト) の場合、numeric_expression は丸められます。0以外の値を指定した場合、numeric_expressionは切り捨てられます。
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
四捨五入ではなく切り詰めることができた方法は次のとおりです。
select 100.0019-(100.0019%.001)
100.0010を返します
そしてあなたの例:
select 123.456-(123.456%.001)
123.450を返します
ここで、末尾のゼロを削除したい場合は、単純にキャストします。
select cast((123.456-(123.456%.001)) as decimal (18,2))
123.45 を返します
実際、3 番目のパラメータが 0、1、2 のいずれであっても、値は丸められません。
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Round にはオプションのパラメータがあります
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
四捨五入のない別の切り捨ての解決策と例。
Convert 71.950005666 to a single decimal place number (71.9)
1) 71.950005666 * 10.0 = 719.50005666
2) Floor(719.50005666) = 719.0
3) 719.0 / 10.0 = 71.9
select Floor(71.950005666 * 10.0) / 10.0
小数点が必要ですか?
そうでない場合は、使用してください
select ceiling(@value),floor(@value)
0 で実行する場合は、ラウンドを実行します。
select round(@value,2)
これにより、任意の数値の小数部分が削除されます
SELECT ROUND(@val,0,1)
これがかなり遅れていることはわかっていますが、私はこれが答えとは思えず、何年もこのトリックを使用してきました。
値から .005 を引いて、Round(@num,2) を使用するだけです。
あなたの例:
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
123.45 を返します
探している正しい値に丸めが自動的に調整されます。
ところで、映画『オフィス・スペース』のプログラムを再現しているのでしょうか?
小数点以下 3 桁の値を小数点以下 2 桁に変換するには、このコードを使用してみてください。
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
出力は123.46です
小数の値のみが必要だと思います。この場合、次のことを使用できます。
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
別の方法は ODBC TRUNCATE
関数:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
出力:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
述べる:
組み込みの使用をお勧めします ROUND
3 番目のパラメータを 1 に設定した関数。
この質問が本当に古いことは知っていますが、丸めに部分文字列を使用した人は誰もいませんでした。これは、非常に長い数値を四捨五入できるという利点があります (SQL サーバーの文字列の制限は通常 8000 文字です)。
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
私が考える最も簡単な方法です。