5

ユーザーによるエラーを修正するために、MS Sql Server(2005または2008は関係ありません)によってホストされているデータベースの小数点以下の桁を数える必要があります。Oracleデータベースでも同じ問題が発生しますが、それほど複雑ではありません。結論は、Oracleの選択は次のとおりです。

select length( substr(to_char(MY_FIELD), instr(to_char(MY_FILED),'.',1,1)+1, length(to_char(MY_FILED)))) as digits_length
from MY_TABLE

ここで、filed My_filedはfloat(38)です。

Ms Sqlサーバーで使用しようとしています:

select LEN(SUBSTRING(CAST(MY_FIELD AS VARCHAR), CHARINDEX('.',CAST(MY_FILED AS VARCHAR),1)+1, LEN(CAST(MY_FIELD AS VARCHAR)))) as digits_length
from MY_TABLE

問題は、MS Sql Serverで、MY_FIELDをvarcharとしてキャストすると、浮動小数点数が小数点以下2桁だけ切り捨てられ、桁数が間違っていることです。誰かが私に何かヒントを与えることができますか?

よろしくお願いします。

4

4 に答える 4

8
SELECT 
LEN(CAST(REVERSE(SUBSTRING(STR(MY_FIELD, 13, 11), CHARINDEX('.', STR(MY_FIELD, 13, 11)) + 1, 20)) AS decimal)) 
from TABLE
于 2013-07-04T09:17:47.603 に答える
5

私は友人から非常にシンプルな解決策を受け取りました。そこで、私と同じ立場にある他の人を助けるために、回避策を投稿します。

まず、関数を作成します。

create FUNCTION dbo.countDigits(@A float) RETURNS tinyint AS
BEGIN
declare @R tinyint
IF @A IS NULL 
   RETURN NULL
set @R = 0
while @A - str(@A, 18 + @R, @r) <> 0
begin
   SET @R = @R + 1
end
RETURN @R
END
GO

2番:

select MY_FIELD,
dbo.countDigits(MY_FIELD) 
from MY_TABLE

この関数を使用すると、小数点以下の正確な桁数が得られます。

于 2012-12-20T09:31:33.590 に答える
0

まず、CONVERTではなく使用に切り替えることですCAST。違いは、でCONVERT、フォーマットコードを指定できることです。CASTデフォルトのフォーマットコードは何でも使用します:

式がfloatまたはrealの場合、styleは次の表に示す値のいずれかになります。その他の値は0として処理されます。

どのフォーマットも特に魅力的ではありませんが、あなたが使用するのに最適なのはだと思います2。したがって、次のようになります。

CONVERT(varchar(25),MY_FIELD,2)

残念ながら、これにより科学的記数法で常に16桁の値が得られます1.234567890123456e+000。「実際の」桁数を取得するには、この数を分割し、小数点以下の桁数を計算して、指数で指定された数でオフセットする必要があります。


そしてもちろん、定義された2進表現を持つ数値を扱うときに、数字について話そうとすることについての通常の警告/警告を挿入します。特定の「桁」の数は、計算方法によって異なる場合があります。float

于 2012-12-19T13:22:58.123 に答える
0

速度についてはよくわかりません。など、またはこのコードの優雅さ。最初の 10 進数値を見つけるためのアドホック テストでした。しかし、このコードを変更して、すべての小数をループし、最後に値が 0 より大きかった時間を簡単に見つけることができます。

DECLARE @NoOfDecimals       int             = 0 
Declare @ROUNDINGPRECISION  numeric(32,16)  = -.00001000

select @ROUNDINGPRECISION = ABS(@ROUNDINGPRECISION)
select @ROUNDINGPRECISION = @ROUNDINGPRECISION - floor(@ROUNDINGPRECISION)


while @ROUNDINGPRECISION < 1
Begin
    select @NoOfDecimals = @NoOfDecimals +1
    select @ROUNDINGPRECISION =  @ROUNDINGPRECISION * 10

end;

select @NoOfDecimals
于 2016-10-07T16:05:18.007 に答える