SQL Serverで小数点以下を切り捨てる(丸めない)


194

丸めずにSQLで余分な小数点以下を切り捨てまたは削除する最良の方法を決定しようとしています。例えば:

declare @value decimal(18,2)

set @value = 123.456

これは自動的にに丸め@valueられます123.46。これはほとんどの場合に適しています。ただし、このプロジェクトでは必要ありません。不要な小数を切り捨てる簡単な方法はありますか?left()関数を使用して、10進数に戻すことができることを知っています。他の方法はありますか?

回答:


188
select round(123.456, 2, 1)

27
答えは、関数のパラメーターが何であるかを説明する必要があります
Tyler

9
SQL ROUND(数値、小数、演算):演算-> 0の場合、結果を小数に丸めます。0以外の値の場合、結果は小数点以下の桁数に切り捨てられます。デフォルトは0
Midhun Darvin

あなたは命の恩人です、私には最後の2桁だけを表示する量がありました "1.9991666"、しかしそれは私が何を使っても常に2に切り上げられます、これで私はこのようなことを達成できます-FORMAT(round(1.9991666 、2、1)、 'N2')AS 'Rate'、サンクスメイト
スパイダー

269
ROUND ( 123.456 , 2 , 1 )

3番目のパラメーター!= 0の場合、丸めるのではなく切り捨てます

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

構文

ROUND ( numeric_expression , length [ ,function ] )

議論

  • numeric_expression ビット・データ・タイプを除いて、正確な数値または近似数値データ・タイプのカテゴリーの式です。

  • length numeric_expressionを丸める精度です。lengthは、tinyint、smallint、またはint型の式でなければなりません。lengthが正の数の場合、numeric_expressionは、lengthで指定された小数点以下の桁数に丸められます。lengthが負の数の場合、numeric_expressionは、lengthで指定されているように、小数点の左側で丸められます。

  • function 実行する操作のタイプです。functionは、tinyint、smallint、またはintでなければなりません。関数が省略されるか、値が0(デフォルト)の場合、numeric_expressionは丸められます。0以外の値が指定された場合、numeric_expressionは切り捨てられます。

関数の引数のどの値がtinyint、smallint、intに対応するか知っていますか?Microsoftはその部分をドキュメントに残しておらず、答えをどこにも見つけることができません。msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVERは、IQとは少し異なる方法で数値を丸めます。修正するには、このround(val1 / val2,4,1)のようなround(x、y、z)関数を使用します
Warren LaFrance

37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

13

以下は、丸めずに切り捨てることができた方法です。

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を返します


10

実際、3番目のパラメーターが0、1、2のいずれであっても、値は丸められません。

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

この答えがわかりません。指定されたSQLの結果は10.01になります。これは、10.0055を小数点以下2桁に正しく丸めることです。最後のパラメーターが0でない場合、値は(小数点以下2桁に)切り捨てられて10.00になります。
8128

7

ラウンドにはオプションのパラメータがあります

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
ラウンド(123.456、2、1)を選択します= 123.450
Bikram

4
これが賛成票を獲得する理由はわかりません。上記では、それぞれ123.450と123.460が得られます。
remykarem

7

10進数が必要かどうか。

そうでない場合は、

select ceiling(@value),floor(@value)

それを0で行う場合は、ラウンドを実行します。

select round(@value,2)

1
明確でない場合は申し訳ありませんが、小数点以下の桁数を保持する必要があります。不要な桁は削除してください。たとえば、上記の例の123.456が123.46に変換されるのではなく、3番目の小数点を切り捨てて123.45にしたいとします。
Ryan Eastabrook 2008

6

丸めのソリューションと例がない別の切り捨て。

    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

2
+1 Floor()は、実際に丸めずに小数を切り捨てる方法です。残念なことに、Floor()には、どの位置にあるかを示す2番目のパラメーターがありません。しかし、私は* 10)/ 10が実際にこれをうまく回避すると思います。
deroby

4

これにより、任意の数値の小数部分が削除されます

SELECT ROUND(@val,0,1)

2
ありません。SELECT ROUND(123.4560,0,1)は、代わりに123.0000を返します。
remykarem


1

別の方法はODBC TRUNCATE関数です:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

出力:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

リマーク:

ROUND3番目のパラメーターを1に設定して組み込み関数を使用することをお勧めします。


1
ODBCスカラー関数-別の代替!
Arulmouzhi

1

私はこれがかなり遅いことを知っていますが、私はそれを答えとは考えておらず、このトリックを何年も使用しています。

単に値から.005を引いて、Round(@ num、2)を使用します。

あなたの例:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123.45を返します

それは自動的にあなたが探している正しい値に丸めを調整します。

ちなみに、あなたは映画のオフィススペースからプログラムを再作成していますか?


0

このコードを使用して、小数点以下3桁の値を小数点以下2桁に変換してみてください。

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

出力は123.46です


1)3行目は、彼は明示的に、彼は数を丸めるが、結果は123.45)でなければなりません(これを切り捨てたくないと言った2)完全に不要である
ダミアン・パブロ・ゴンサレス

0

10進数の値だけが必要だと思います。この場合、次のように使用できます。

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

0

私はこの質問が本当に古いことを知っていますが、誰もサブストリングを使用して丸めませんでした。これは、本当に長い数値を丸める機能としての利点です(SQLサーバーでの文字列の制限で、通常は8000文字です)。

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

私はハッカーランクにある簡単な例の解決策でもっと簡単にできると思います:

問題ステートメント:137.2345未満であるSTATIONからの北緯(LAT_N)の最大値をクエリします。答えを小数点以下4桁に切り捨てます。

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

上記のソリューションでは、値を小数点以下4桁に制限する方法を説明しています。10進数の後に数値を増減する場合は、4を好きなように変更します。


-3

Mod(x,1) 私が考える最も簡単な方法です。


-5
select convert(int,@value)

1
これはOPが望んでいたものではありません。彼はまだ小数点以下の桁数を求めていますが、四捨五入するのではなく、小数点以下を削除(切り捨て)したいと考えています。IE 123.456-> 123.45 NOT 123.456-> 12.46およびNOT 123.456-> 123
John
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.