Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Oracle数据库获取浮点值时出现Java精度问题-不';不能正确地旋转_Java_Oracle_Jsp_Precision_Bigdecimal - Fatal编程技术网

从Oracle数据库获取浮点值时出现Java精度问题-不';不能正确地旋转

从Oracle数据库获取浮点值时出现Java精度问题-不';不能正确地旋转,java,oracle,jsp,precision,bigdecimal,Java,Oracle,Jsp,Precision,Bigdecimal,我正在运行一个JSP web应用程序,它从Oracle数据库检索一个数值,并将其显示在网页上。我手动输入了2929.2的值,手动查询数据库确认它存储为该值。但是,当我通过JSP检索它时,它显示为2929.199951172。我怎样才能解决这个问题?我使用的是ResultSets和getDouble()方法。它以浮点形式存储在Oracle中,但是——请原谅我的无知——据我所知,它的精度与Java double一样高,而getFloat()不是我想要的 我略读了几篇关于BigDecimal的文章,但

我正在运行一个JSP web应用程序,它从Oracle数据库检索一个数值,并将其显示在网页上。我手动输入了2929.2的值,手动查询数据库确认它存储为该值。但是,当我通过JSP检索它时,它显示为2929.199951172。我怎样才能解决这个问题?我使用的是ResultSets和getDouble()方法。它以浮点形式存储在Oracle中,但是——请原谅我的无知——据我所知,它的精度与Java double一样高,而getFloat()不是我想要的


我略读了几篇关于BigDecimal的文章,但如果我不知道它是我所需要的,我会犹豫是否要改变一切

您应该使用
BigDecimal
,因为这就是它的用途:以任意精度处理浮点值。从javadoc:

不可变、任意精度有符号十进制数。
BigDecimal
由一个任意精度的整数无标度值和一个32位整数标度组成

当从数据库的
十进制
(或
数字
)字段检索数据时,此类型被大量使用,因为它允许保持存储在数据库中的值的精度。这专门用于金融应用/操作

顺便说一下,您还应该将Oracle数据库中使用的类型从
FLOAT
更改为

除非我知道这是我所需要的,否则我不会改变一切


如果您想/需要以正确的方式处理这些数值,您应该将所有内容更改为
BigDecimal

好吧,您需要
BigDecimal
,因为这就是它的用途:以精确的浮点值处理数据库中的字段。使用,也可以读取(如果您不能理解,至少阅读一下)@LuiggiMendoza:那么我可以使用getBigDecimal()但将其转换为双精度,还是会遇到同样的问题?如果不彻底检查我正在使用的程序,我无法改变存储双精度的最终方式,此时我的主管可能更愿意告诉我们的(内部)客户处理它,而不是那样做。@slothario一旦使用
BigDecimal
,请使用
BigDecimal
保留所有操作。感谢您的输入。不幸的是,这是一个大型企业数据存储,我不能将其更改为十进制。此外,我还必须解决由我正在扩展的大型开源程序(特别是JTrac)引入的许多糟糕的设计决策。我们使用它的目的远不止它的设计目的,它将所有东西都存储为双倍存储——这将是一次彻底的改变,影响的不仅仅是我的小角落。我并不是故意刁难你,我很感谢你的反馈,但是还有其他的解决办法吗?@slothario nope,你运气不好。