2009-06-16 13 views
0

私はデータベースorderpricedepositフィールドをfloat型に設定しています。私はまた、注文を検索するためにjava GUIを実装しています、問題は、データベースで注文を検索しようとしたときです。何も見つかりません。なぜなら、文字列を浮動小数点に変換し、 55.問題は何ですか? 私は双方の側、Java側とmysql側から通貨を表すためにどのようなタイプを使用すべきですか?ここmysql float型

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {   
    try{ 
     //collect arguments 
     String category = this.jTextField8.getText(); 
     String pattern=this.jTextArea1.getText(); 
     String color=this.jTextArea2.getText(); 
     float price = Float.valueOf(this.jTextField14.getText()).floatValue(); 
     float deposit = Float.valueOf(this.jTextField15.getText()).floatValue(); 

     //create new order 
     int row=this.customerSelectedRow; 
     Order newOrder=new order(this.customerModel.dataVector.get(row),category,pattern,color,price,deposit); 
     newOrder.search();   
     //refresh 
     this.jDialogNewOrder.setVisible(false); 

    }catch(Exception e){ 
     System.err.println (" Error message: " + e.getMessage()); 
    } 

}      

あなたは浮動小数点値との通貨での検索方法

try { 
       s = c.conn.prepareStatement("SELECT id FROM `"+this.table+ 
         "` WHERE customerId=? AND category=? and pattern=? and color=? and deposit=? and price=?"); 
       s.setInt(1,this.customer.getId()); 
       s.setString (2, this.category); 
       s.setString (3, this.pattern); 
       s.setString (4, this.color); 
       s.setFloat(5,this.deposit); 
       s.setFloat(6,this.price); 
       System.err.println(s.toString()); 
       ResultSet res = s.executeQuery(); 

       System.out.println("printing ids :"); 
       while (res.next()) { 
        int i = res.getInt(1); 
        //assigning the correct id to the inserted customer 
        this.id=i; 
        System.out.println("id" + "=" + i); 
       } 
      } catch (SQLException e) { 
       System.err.println ("find id Error message: " + e.getMessage()); 
       System.err.println ("find id Error number: " + e.getErrorCode()); 

答えて

10

のコードを扱っているのですか?

しないでください。

Floating point valuesは、2進小数の表現であるため、正確な小数値を表すことはできません。 $ 1.0000000000001などの値で終わらせたくない場合は、小数点タイプなどの整数型のデータ型を使用してください。

==演算子を使用した比較が意図したとおりに機能しないのは、10進数で表現できる数値の多くを浮動小数点で表現できないため、完全に一致しないためです。ここで

は、少し例を示します

System.out.println(1.00000001f == 1.00000002f); 
System.out.println(200000.99f - 0.50f); 

出力:

true 
200000.48 

これらの2つの例では、通貨の浮動小数点値に頼ることは、このような良いアイデアではないことを示す必要があります。

タイプがない限り、通貨価値の保管に関しては、DECIMALタイプがMySQLにもあるようですので、それがより良い選択となると思います。ここで情報を得た意見を与えるためにSQLデータベースを使用します。

はここSection 10.2: Numeric Types、MySQL 5.1リファレンスマニュアルから少し情報です:

DECIMALNUMERICデータ型は正確な数値データに 値を格納するために使用 です。 MySQLでは、NUMERICは、DECIMALとして実装された です。これらのタイプの は、正確に の精度を維持するために、 が重要である値を格納するために使用されます。たとえば、 の金額のデータがあります。

:ここ

は、関連する質問です
+0

非常に良い答えです。 :-) –

1

浮動小数点数を比較するときは、通貨を扱うときには常に小さな範囲、たとえばプラスまたはマイナス半ペニーで比較する必要があります。正確に等価でそれらを比較すると、浮動小数点は大部分の小数を正確に表現しないため、常にエラーが発生します。

通常、お金は浮動小数点ではなくDECIMALとしてmySqlに格納されるため、この問題が原因です。 DECIMALは同じ不正確さに悩まされません。

関連する問題