我将值存储在定义为float的列中。当我从数据库中读回这些值时,它们有时与原始值的差异远远超出我的预期(我知道浮点数不存储确切的值,请查看示例以了解我的意思)。
这是我的测试用例:
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)
正如您所看到的,选择value2会产生11743.8,而选择round(value2,6)会产生一个更接近我最初放入的值的值。如果你
mysql> select * from float_test mt where value1 = value2;
+-----------+---------+
| value1 | value2 |
+-----------+---------+
| 11743.850 | 11743.8 |
+-----------+---------+
1 row in set (0.00 sec)
您可以看到存储在value1和value2中的值实际上是相等的。因此,我认为这只是结果如何显示的问题。通过MySQL文档查看,我找不到任何说明如何自动舍入浮动值以进行显示的规则
所以现在我有两个问题:
1. mysql用于显示浮点值的规则是什么?
2.有没有办法(例如一些配置选项)我可以检索未舍入到第一个小数位的值而不修改我的表定义而不更改我的select语句?
我在mysql 4.0,5.0和5.1上测试了这个。
谢谢你,
斯蒂芬
答案 0 :(得分:4)
如果要保持2个小数点的精度,则应该明确地将字段创建为float(M,D),其中D = 2(精度),M =所需的总位数。
例如,将字段定义为float(8,2)可能会产生您想要的效果。
重要的是要记住,float和double用于在MySQL中存储近似值...您可能最好使用DECIMAL数据类型...例如,DECIMAL(8,3)。
小心。
答案 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