我一直在网上阅读有关在java中处理float
和double
类型的问题。不幸的是,图像仍然不清楚。因此,我在这里直接问。 :(
我的MySQL
表有各种DECIMAL(m,d)
列。 m
的范围可以是5到30. d
保持不变为2。
我应该在Java中使用什么等效的数据类型来处理(即存储,检索和处理)表格中值的大小? (我已经双了 - 所以这个帖子。)
在尝试从字符串中解析double时,我遇到了错误
Double dpu = new Double(dpuField.getText());
例如 -
"1" -> java.lang.NumberFormatException: empty String
"10" -> 1.0
"101" -> 10.0
"101." -> 101.0
"101.1" -> 101.0
"101.19" -> 101.1
我做错了什么?将字符串转换为double值的正确方法是什么? 我应该采取什么措施来对这些价值观进行操作?
这是代码 -
System.out.println(dpuField.getText());
Double dpu = new Double(dpuField.getText());
System.out.println(dpu);
是的,问题在于getText()
报告dpuField
的错误值。
在JTextField keyTyped
事件上调用此方法。那么这里出了什么问题?
看:
http://journals.ecs.soton.ac.uk/java/tutorial/post1.0/ui/keylistener.html
显然,keyTyped()
没有给我键码。我必须切换到keyRealeased()
答案 0 :(得分:5)
我应该在Java中使用什么等效数据类型来工作(即存储,检索和处理)与表中值的大小? (我已经以双重结算了 - 因此这篇文章)。
由于它是DECIMAL
字段,您应该prefer java.math.BigDecimal
。您可以使用PreparedStatement#setBigDecimal()
将其存储在数据库中,然后使用ResultSet#getBigDecimal()
从数据库中检索它。
在尝试从字符串中解析double时,我遇到错误
这不可能是真的。问题出在其他地方。也许它只是没有返回您希望返回的数据,或者您没有使用/调试您期望的值。
答案 1 :(得分:4)
如果您需要精确的精度而没有舍入错误,则应使用BigDecimal
。
您的代码看起来不错 - 可能是dpuField.getText()
以某种方式从上面列出的字符串值中删除了最后一个字符吗?
更新:您说
是的,问题在于
getText()
报告dpuField
的错误值。在JTextField
keyTyped
事件上调用此方法。
可能是getText()
在实际附加了最后一个键入的键之前返回字段的值吗?
答案 2 :(得分:1)
对于十进制,我相信如果你不在Java端使用BigDecimal
,你可能会失去精度,因为一些小数部分不能存储为二进制分数。
首选Double.valueOf(String)
构造函数,但这是一种有效的方法。还有其他事情必须继续(即我怀疑那些是你传入的实际字符串值)。
答案 3 :(得分:1)
问题1:将DECIMAL列映射到Double是个坏主意,通常BigDecimal
是正确的类型。 http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#1055175
问题2:你做错了什么;在转换之前打印String值。