2009-07-22 54 views
4

我將值存儲在定義爲float的列中。當我從數據庫中讀回這些值時,他們有時會與原始值有很大差異(我知道float沒有存儲確切值,請看一下示例以瞭解我的意思)。MySQL用於顯示浮點值的規則是什麼?

這裏是我的測試案例:

drop table if exists float_test; 
create table float_test (value1 float(8, 3), value2 float); 
insert into float_test values (11743.85, 11743.85); 
select mt.*, round(mt.value1, 6), round(mt.value2, 6) from float_test mt; 

選擇的結果是:

mysql> select mt.*, round(mt.value1, 6), round(mt.value2, 6) from float_test mt; 
+-----------+---------+---------------------+---------------------+ 
| value1 | value2 | round(mt.value1, 6) | round(mt.value2, 6) | 
+-----------+---------+---------------------+---------------------+ 
| 11743.850 | 11743.8 |  11743.849609 |  11743.849609 | 
+-----------+---------+---------------------+---------------------+ 
1 row in set (0.01 sec) 

正如你可以看到,選擇值2的結果11743.8而選擇圓(值2,6)結果這個數值與我最初輸入的數值非常接近。同樣如果你

mysql> select * from float_test mt where value1 = value2; 
+-----------+---------+ 
| value1 | value2 | 
+-----------+---------+ 
| 11743.850 | 11743.8 | 
+-----------+---------+ 
1 row in set (0.00 sec) 

你可以看到t存儲在value1和value2中的值實際上是相等的。因此,我認爲這只是結果如何顯示的問題。仔細查看MySQL文檔,我找不到任何規則說明浮動值如何自動四捨五入來顯示。
所以現在我有兩個問題:
1. mysql用於顯示浮點值的規則是什麼?
2.是否有一種方法(例如一些配置選項)我可以檢索未舍入到第一個小數位的值,而不修改我的表定義並且不更改我的選擇語句?

我已經在mysql 4.0,5.0和5.1上測試了這個。

謝謝
斯特凡

回答

0

這並不完全回答我的問題,但解決了我的問題,因爲我使用jdbc連接到數據庫:
當使用PreparedStatements而不是普通語句時,您會得到期望的結果。
代碼:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class JDBCTest { 
    private static final String URL = "jdbc:mysql://sp101ap0006:3306/lvs_server_38080"; 
    private static final String USER = "user"; 
    private static final String PASSWD = "abc"; 

    private static void executeQuery(Connection connection) throws SQLException { 
     Statement statement = connection.createStatement();   
     ResultSet queryResult = statement.executeQuery("select * from float_test"); 
     queryResult.first(); 
     System.out.println(queryResult.getFloat(1) + " - " + queryResult.getFloat(2)); 
    } 

    private static void executePreparedQuery(Connection connection) throws SQLException { 
     PreparedStatement statement = connection.prepareStatement("select * from float_test"); 
     ResultSet queryResult = statement.executeQuery(); 
     queryResult.first(); 
     System.out.println(queryResult.getFloat(1) + " - " + queryResult.getFloat(2)); 
    } 

    public static void main(String[] args) { 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection connection = DriverManager.getConnection(URL, USER, PASSWD); 
      executeQuery(connection); 
      executePreparedQuery(connection); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

得出以下結果:

11743.85 - 11743.8 
11743.85 - 11743.85 
4

如果你想保持的2個小數點精確,你應該明確地創建(M,d)現場爲float其中d = 2(精度)和M =所需的總數位數。

例如,將字段定義爲float(8,2)可能會產生您想要的結果。

請務必記住float和double用於在MySQL中存儲近似值......使用DECIMAL數據類型...例如DECIMAL(8,3)可能會更好。

保重。