有没有办法阻止Java将我的双精度转换为指数值?

时间:2012-07-12 09:40:44

标签: java jdbc

有没有阻止Java将我的双精度转换为指数值?我有问题将其保存到我的数据库中。它一直告诉我它无法将我的VarChar转换为数字。

我做;

amt = oldAmt - amt;
amt = Math.abs(amt);

使用setter

将值放在 amt
jvd.setDr_amt(amt);

然后使用函数生成一个查询字符串,它给了我;

INSERT INTO jv ( id, dr_amt) VALUES (1, 1.595545786E7);

数据库中dr_amt的数据类型为数字(15,2)

任何?

2 个答案:

答案 0 :(得分:7)

我非常猜测你做了这样的事情:

connection.createStatement().executeUpdate(
  "INSERT INTO my_table VALUES('" + myDouble + "')");

出于以下原因不要这样做:

  • 连接字符串会导致语法错误
  • 连接字符串将导致SQL注入

以让JDBC处理数据类型的方式编写语句:

PreparedStatement stmt = connection.prepareStatement(
  "INSERT INTO my_table VALUES(?)");
stmt.setDouble(1, myDouble);
stmt.executeUpdate();

如果您绝对必须在SQL字符串中内联您的double值而不是使用绑定值,请尝试使用BigDecimal来序列化double,而不是:

new BigDecimal(myDouble).toString();

由于您似乎在操作货币值,因此您应该将所有双打更改为BigDecimal,因为BigDecimal是Java的DECIMAL数据类型的最佳匹配

答案 1 :(得分:4)

你应该使用带有绑定参数的JDBC 预备语句,例如

PreparedStatement s = c.prepareStatement(
        "INSERT INTO mytable (myfield) VALUES (?)");
s.setDouble(1, n);
s.executeUpdate();

[省略异常处理代码]

JDBC层将确保您的双变量正确发送到数据库服务器而不会受到损坏。