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