タイプの列に支払いが保存されているテーブルがありますVARCHAR
これは、フィールドからのサンプルデータです。
10.01
55.11
VARCHAR
最近、新しいリクエストの一環として、列に格納する数値から小数点を削除する必要がありました。
だから、私はこれを持っていました:
CONVERT(BIGINT, CONVERT(REAL, RTRIM(LTRIM(@amt))) * 100) as PaymentAmount
に変換するにはREAL
(からに変換できません)、100を掛けてBIGINT
からに変換しますVARCHAR
BIGINT
現在、問題は、変換中に、最終結果が1セント少なくなる場合があります。
例:'10.11'
に変換され1010
ます10.15
1014
これをテストする簡単な方法:
SELECT CONVERT(BIGINT, CONVERT(REAL, RTRIM(LTRIM(10.15))) * 100) as PaymentAmount
クエリの結果はです1014
。
REAL
からへの変換を変更し、へのFLOAT
変換を削除することで問題を修正しましたBIGINT
。
別の修正は、次のCAST
ように使用することです。
CAST(@amt as float)*100 as PaymentAmount
10.00
から10.99
100の値の範囲の数値で変換を実行しましたが、間違った数値は次のとおりです。
10.11
に変換します1010
10.15
に変換します1014
10.19
に変換します1018
10.23
に変換します1022
その範囲の他のすべての値は問題ありません。不思議なことに、11.11
うまく変換され1111
ます。
だから問題は、なぜ一体それをやっているのか、そしてパターンは何ですか?DataTypeからMSDNREAL は正確な数値ではありませんが、FLOATも正確な数値ですが、floatは全範囲で機能します。
編集:私varchar
はサイズが1000であることに言及しませんでした。