什么MySQL类型可以在不损失精度的情况下存储Java Double?

What MySQL type can store a Java Double without loss of precision?

提问人:Jim 提问时间:11/4/2022 最后编辑:Peter MortensenJim 更新时间:11/8/2022 访问量:360

问:

我在来自服务器的 Java 应用程序中有一个值。我想将该值存储在MySQL中,但我不希望发生任何形式的精度损失。Double

它有点将其存储为 .如何在MySQL表中定义相应的数据类型,以便在应用程序接收到它时完全存储它?textDOUBLE

我在MySQL文档中看到数据类型需要传递精度。所以我不确定如何安全地定义它。

MySQL 精度

评论

1赞 Tim Biegeleisen 11/4/2022
使用精确数值类型,例如 或 .NUMERICDECIMAL
1赞 Jim 11/4/2022
@Tom:我无法在 java 级别更改数据类型。我应该从那时创建一个并存储它吗?BigDecimalDouble
1赞 Ryan M 11/4/2022
@Tom这个问题也没有回答这个问题。如果你的值被 a 充分表示,你为什么要切换到 ?BigDecimalDouble
1赞 Tom 11/4/2022
你可以这样做,但这无济于事。Double 是一种不精确的数据类型,因此当值为 Double 时,您已经损失了精度。从中创建 BigDecimal 时,您可以防止额外的损失,但您将无法获得服务器上存在的 100% 正确值。
1赞 Ryan M 11/4/2022
@Tom 您假设存在精度损失,但问题似乎意味着该值在 Java 应用程序中得到了准确的表示。假设服务器也使用 64 位浮点数,则不会损失精度。

答:

1赞 MisterMiyagi 11/4/2022 #1

MySQL DOUBLE 已经是 64 位又名双精度浮点类型,就像 Java 的一样。两者都可以存储相同的值而不会损失精度;Java值可以完全存储在MySQL中。DoubleDoubleDOUBLE

用于定义精度或位数的替代语法是可选的。当标准或足够时,没有义务使用它们。FLOATDOUBLE

评论

0赞 Jim 11/4/2022
因此,如果 java 应用程序有一个 并且MySQL表的设置是如果我存储Java的值,它会得到?double0.0117340087990645Doubleselect0.0117340087990645
0赞 MisterMiyagi 11/4/2022
@Jim 是的,只要您在读取/写入过程中不(意外)更改类型,您就可以取回您输入的确切值。
0赞 Jim 11/4/2022
通过改变类型,你的意思是铸造?
1赞 MisterMiyagi 11/4/2022
@Jim 任何形式的皈依,真的。比如说,在将 Java 存储为 .DOUBLEfloatdouble
1赞 Karl Knechtel 11/5/2022
@PeterMortensen 我不认为我们关心为此目的的中间表示,因为无论如何都无法将 Java 代码中的多余位传达给数据库——它们只是暂时存在于硬件级别。也就是说,我无法理解为什么数据库不会通过逐位复制(不注意 nans 等的语义解释)将 Java 代码中表示的 64 位值存储到 64 位宽的数据库列中的任何技术原因。