1

PerlからNUMERIC(19,5)型のSQLServer2005データベース列に値を挿入しています。絶対値が.0001以上である限り、機能しています。ただし、値が小数点以下5桁になると、Perlは値を(-9e-05ではなく-0.00009)指数形式で格納し始め、SQLServerからエラー" Error converting data type varchar to numeric"が発生します。それを防ぎ、小さな数値を適切に挿入するにはどうすればよいですか?

perl v5.8.5、DBI 1.56、DBD :: Sybase 1.07、およびSQLServer2005を使用しています。

コードはおおよそ次のとおりですが、無関係なフィールドを削除しました。

$invoice->{IL_UNITPRICE} = 0.09; # Actually comes from another database
$invoice->{IL_PRICEUNITCONV} = 0.001; # Actually comes from another database
$unitprice = $invoice->{IL_UNITPRICE} * -1 * $invoice->{IL_PRICEUNITCONV};
#$unitprice equals -9e-05 at this point.
$sth = $dbh->prepare('INSERT INTO foo ( bar ) VALUES ( ? )');
$sth->execute($unitprice);

上記の行はエラーで失敗します:DBD::Sybase::st execute failed: Server message number=8114 severity=16 state=5 line=2 server=baz text=Error converting data type varchar to numeric.

4

2 に答える 2

2

試す

$sth->execute(sprintf("%.6f",$unitprice));

少し拡張するには-ネイティブのfloat/doubleをDBiインターフェースに渡すと、文字列に変換されます。特に指定しない場合は、Perlのデフォルトのフォーマット規則(Cコンパイラーによって課せられる)を使用します。デフォルトは6桁の精度であり、数値がそれを超える場合は、科学的記数法でレンダリングされます。

固定小数点形式を取得するには、sprintfを使用して明示的に要求する必要があります。

于 2009-09-24T18:15:49.430 に答える
0

実際、Math::Bigintとそれに関連するMath::BigFloatを使用してもこの問題は解決すると思います。フロートや十分に大きなサイズの数値を使用するときはいつでも、これらのモジュールを使用するので、本当にフォーマットを制御したい場合を除いて、sprintfをあちこちに投げる必要はありません。

于 2009-09-25T05:04:13.153 に答える