提问人:Will Sumekar 提问时间:2/22/2011 更新时间:11/10/2023 访问量:2823
在 JDBC Insert 中用随机数填充的 BigDecimal 变量
BigDecimal variable padded with random numbers in JDBC Insert
问:
考虑 Oracle 类型为 NUMBER 的 SQL 语句。INSERT INTO table (field) VALUES (-0.11111111)
field
当要插入的值的类型为 float 或 double 时,您将获得 中的确切值,即 -0.11111111。field
但是,当要插入的值为 类型时,您将获得用随机数填充的值,即 0.11111110999999999990428634077943570446223。BigDecimal
为什么?
Java 指出“是一个不可变的、任意精度的有符号十进制数”。BigDecimal
代码为:
String sql = "INSERT INTO pat_statistics (file_key,test_number,rqw)"
+ " VALUES (3778, 100, " + new BigDecimal(-0.11111111) + ")";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, pwd);
Statement st = conn.createStatement();
int n = st.executeUpdate(sql);
数据库是 Oracle。
答:
4赞
Jens Schauder
2/22/2011
#1
您正在从 a 创建 BigDecimal,因此它将准确反映 的值,并且您可能知道浮点数的尾部数字更随机。double
double
我假设您在数据库中看到这一点,因为 JDBC 驱动程序认为:嘿,我得到了一个 .我可以使用我能掌握的所有数字。BigDecimal
当您使用或 JDBC 驱动程序知道我不能真正使用所有数字并忽略该阈值之后的内容时。float
double
如果您需要 的额外精度 ,则从 a 创建它或从 s 计算它。BigDecimal
String
Integer
更正
处理不是由 JDBC 驱动程序完成的,而是通过各种转换完成的,因为您正在组装 SQL 字符串。toString
顺便说一句:你真的应该为此使用绑定变量。
评论
1赞
Will Sumekar
2/22/2011
谢谢Jens。稍微更正一下:BigDecimal 是从 double 创建的,而不是浮点数。
3赞
Jörn Horstmann
2/22/2011
#2
对于文本值,应始终使用采用字符串参数的 BigDecimal 构造函数。有关详细信息,请参阅 BigDecimal(double) 构造函数的文档。
评论