mysql设置float四舍五入_关于MySQL中存储类型为Float,使用jdbc查询时丢失精度,或者自动四舍五入的问题...

一.   mysql表结构:

bc21d2fac7fa2308d93510bbec97d88d.png

member_price列的数据类型是float(20,2)(注: 表示最多20位浮点数,精度为2位)

插入记录:

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘1‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.8745120‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘2‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.8743120‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘3‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.874‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘4‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.879‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘5‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.871‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘6‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.87‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘7‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.8‘, ‘1450078966586‘);

INSERT INTO `member_price` (`id`, `data_type`, `month`, `member_count`, `member_price`, `create_at`) VALUES (‘8‘, ‘1‘, ‘2015-11‘, ‘5864‘, ‘1765910.1‘, ‘1450078966586‘);

查询:

64d05f8b9ef4e0ed5b62d793d71ac2ef.png

添加条件查询:

21d328481b271745ecd5dfb29ec2f02e.png

注意:

mysql中的float: 借此例说明float(20,2),虽然设置的精度为2位,但是每次插入值时会保存三位,但保存的这三位数是不精确的,如上所示。

查询时

1. 如果插入是一位小数,但精度是两位,此时插入的数通过相等是查不出来的(除了第一位小数是0和5),因为mysql会将其补全到三位,最终保存的精度也是不准确的

2. 如过插入是两位小数,并且精度是两位,此时插入的数通过相等也并不一定能查出来

3. 对于三位小数的查询,同上

所以在mysql中的数值类型,float是不精确的,尽量避免使用,可使用double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

二.  jdbc中查询float类型的数据

java代码:

2b65ef29a5872cc0e4771c25889edd04.gif

6a087676c59fa8b19d76e6bb55a32902.gif

1 public classMain {2 public static voidmain(String[] args){3 Connection connection = null;4 PreparedStatement preparedStatement = null;5 ResultSet resultSet = null;6 try{7 Class.forName("com.mysql.jdbc.Driver");8 connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user", "root", "123456a");9 String sql = "SELECT * from member_price WHERE `month` = ‘2015-11‘ and data_type = 1";10 preparedStatement =connection.prepareStatement(sql);11 resultSet =preparedStatement.executeQuery();12 while(resultSet.next()){13 System.out.println("string: " + resultSet.getString("member_price")); //通过String类型获取

14 System.out.println("float: " + resultSet.getFloat("member_price")); //通过Long类型获取

15 System.out.println("============>next");16 }17 }catch(Exception e){18 e.printStackTrace();19 }finally{20 try{21 resultSet.close();22 preparedStatement.close();23 connection.close();24 } catch(SQLException e) {25 e.printStackTrace();26 }27 }28

29 }30 }

View Code(代码不太规范,只为了演示)

截取一部分输出:

string: 1765910.88

float: 1765910.9

============>next

string: 1765910.75

float: 1765910.8

============>next

string: 1765910.12

float: 1765910.1

============>next

string: 1765910.25

float: 1765910.2

============>next

string: 1765910.00

float: 1765910.0

============>next

string: 1765910.38

float: 1765910.4

============>next

string: 1765910.50

float: 1765910.5

============>next

string: 1765910.62

float: 1765910.6

============>next

通过上变测试可以发现:

1. 数据库中精度设置为2位,通过resultSet.getString()拿到的值是两位(和mysql中查到的是一致的),但通过resultSet.getLong()拿到的值是一位(这一位数是四舍五入的结果(但25最后拿到的是2,不知道为何))

2. 使用FORMAT(member_price,10),TRUNCATE(member_price,10),ROUND(member_price,10)等函数来查询时,如果通过resultSet.getLong()来获取查询的值,最后也只能获取一位小数,需使用resultSet.getString()获取精确的查询结果。

结论: 最好在mysql中不要使用float类型, 对于浮点数的查询,jdbc中最好使用resultSet.getString()获取查询的结果值,resultSet.getLong()只会拿到一位小数

若有错误,欢迎批评指正^_^

原文:http://www.cnblogs.com/stefanking/p/5058045.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行错误和内存泄漏等问题。它还支持编译检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Java常用的数据类型包括: 1. byte:字节型,范围为-128~127。 2. short:短整型,范围为-32768~32767。 3. int:整型,范围为-2147483648~2147483647。 4. long:长整型,范围为-9223372036854775808~9223372036854775807。 5. float:单精度浮点型,范围为-3.4028235E38~3.4028235E38。 6. double:双精度浮点型,范围为-1.7976931348623157E308~1.7976931348623157E308。 7. boolean:布尔型,只有两个取值:true或false。 8. char:字符型,表示一个字符,范围为0~65535。 JDBC是Java Database Connectivity的缩写,是Java语言访问关系型数据库的统一接口。JDBC提供了一种通用的方法来访问不同的数据库,因此可以通过JDBC连接MySQL、Oracle、高斯数据库等不同的数据库。 JDBC的数据类型MySQL、Oracle、高斯数据库的数据类型对应关系如下: | JDBC数据类型 | MySQL数据类型 | Oracle数据类型 | 高斯数据库数据类型 | |--------------|--------------|----------------|---------------------| | boolean | BIT | NUMBER(1) | BOOL | | byte | TINYINT | NUMBER(3) | INT1 | | short | SMALLINT | NUMBER(5) | INT2 | | int | INTEGER | NUMBER(10) | INT4 | | long | BIGINT | NUMBER(19) | INT8 | | float | FLOAT | FLOAT(24) | FLOAT4 | | double | DOUBLE | FLOAT(53) | FLOAT8 | | BigDecimal | DECIMAL | NUMBER | DECIMAL | | String | VARCHAR | VARCHAR2 | VARCHAR | | Date | DATE | DATE | DATE | | Time | TIME | TIMESTAMP | TIME | | Timestamp | DATETIME | TIMESTAMP | TIMESTAMP | | Clob | TEXT | CLOB | TEXT | | Blob | BLOB | BLOB | BYTEA | 需要注意的是,不同的数据库所支持的数据类型可能会有所不同,因此在使用JDBC连接数据库,需要根据具体的数据库进行相应的类型转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值