2017-08-15 8 views
0

私は最後の1時間はオンラインで調査しましたが、この問題の解決策を見つけることはできません。JDBC callableStatement.setDouble() 'Infinity'が有効な数値またはおおよその数値ではありません

だから、私は、また、二重値を返すbreakDownFee.getAmount()の値を出力しようとしている、上記for eachループを実行する

for (BalanceBreakDownFee breakDownFee : tuitionFee.getBalanceBreakDownFees()) { 
    System.out.println("Balance Breakdown Fee Description : "+breakDownFee.getDescription()); 
    System.out.println("Balance Breakdown Fee Amount : "+breakDownFee.getAmount()); 
    CS_addBalBreakDownFee.setString(1, breakDownFee.getDescription()); 
    CS_addBalBreakDownFee.setDouble(2, breakDownFee.getAmount()); 
    CS_addBalBreakDownFee.registerOutParameter(3, Types.INTEGER); 
    CS_addBalBreakDownFee.executeUpdate(); 
    int balanceBreakDownFeeId = CS_addBalBreakDownFee.getInt(3); 
} 

前有します。ここに出力があります。何らかの理由で

Description :Downpayment 
Amount : 8000.0 
Description :First Quarter 
Amount : 2663.28 
Description :Second Quarter 
Amount : 2663.28 

私はCS_addBalBreakDownFee.setDouble(2, breakDownFee.getAmount());のための呼び出しを行うとき、私はsetDouble()ラインを指すエラーが発生します。

java.sql.SQLException: 'Infinity' is not a valid numeric or approximate numeric value 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:862) 
    at com.mysql.jdbc.PreparedStatement.setDouble(PreparedStatement.java:3252) 

あなたが見ることができるように、私はそれが上記の前の印刷と比較し得るどのような値を参照するために、各ループ内breakDownFee.getAmount()を印刷してみました。

そして、私はこれを取得、

Balance Breakdown Fee Description : Downpayment 
Balance Breakdown Fee Amount : 8000.0 
Balance Breakdown Fee Description : First Quarter 
Balance Breakdown Fee Amount : Infinity 

それは2663.28 double値を受け入れない理由私は理解していません。それはjdbcはまた'Infinity'

として、それを読んでいるように見える、詳細を追加するために、量を格納mysqlの列には、私が2663.28を保存することができますどのようにDECIMAL(10,2)

任意の考えや提案に設定されています値?これは小数点以下2桁の問題ですか?もしそうなら、私はこれをどのように修正できますか?

ありがとうございます。

+0

まず、お金のために浮動小数点を使用するべきではありません。 SQLでは 'DECIMAL'、Javaでは' BigDecimal'を使うべきです。 – EJP

+0

倍精度の列が有効な倍精度値であるため、無限大を値として受け入れない場合、私は驚いています。その列の実際のタイプは何ですか? –

+0

@ MarkRotteveel量を含むJTable列の実際の型は、オブジェクト型に設定されます。 – p3ace

答えて

1

現時点ではJDBCに問題はありません。あなたの問題は、あなたの料金リストをどのように入手しているかにあります。

System.out.println("Balance Breakdown Fee Amount : "+breakDownFee.getAmount()); 

はJDBCとは関係がありませんが、Javaの予約済みの値はInfinityです。ループの前にチェックした時間とループでチェックした時間の間に何が起こっているのかを調べる必要があります。

しかし、これを解決すると、Javaの予約済みのInfinityとNaN(数値ではありません)の値をどうしたらいいかという問題が発生する可能性があります。これが可能な場合、ほとんどの人はそれを特に確認し、値の代わりにヌルを挿入します。アプリケーションのセマンティクスは異なる場合があります。

関連する問題