任何人都可以告诉我或提供对Oracle数字精度和Java类型之间映射的引用,即在什么时候number(x)映射到short,int,long
BigInteger等。
Java的整数类型与Oracle的NUMBER
类型不是完美匹配。本质上,有两种方法可以在世界之间进行映射,但都不完美:
NUMBER(3)
-> Byte
。这样可以确保始终可以将SQL值读取为其Java类型。某些Java值可能无法写入SQL类型。
Byte
->NUMBER(3)
或更少。这将确保byte
始终可以将Java值写入数据库。但是,某些DB值可能无法读取到Java类型中。
由于以下假设,jOOQ默认为第一个:
在jOOQ
3.8.4中,以下逻辑得以实现DefaultDataType.getNumericClass()
:
// Integers
if (scale == 0 && precision != 0) {
if (precision < BYTE_PRECISION) {
return Byte.class;
}
if (precision < SHORT_PRECISION) {
return Short.class;
}
if (precision < INTEGER_PRECISION) {
return Integer.class;
}
if (precision < LONG_PRECISION) {
return Long.class;
}
// Default integer number
return BigInteger.class;
}
// Non-integers
else {
return BigDecimal.class;
}
和:
int LONG_PRECISION = String.valueOf(Long.MAX_VALUE).length(); // 19
int INTEGER_PRECISION = String.valueOf(Integer.MAX_VALUE).length(); // 10
int SHORT_PRECISION = String.valueOf(Short.MAX_VALUE).length(); // 5
int BYTE_PRECISION = String.valueOf(Byte.MAX_VALUE).length(); // 3
如果在某些情况下(例如)NUMBER(3)
用于存储byte
数字127
,则可以通过在代码生成阶段指定重写数据类型来覆盖此默认值。在此处记录:
http://www.jooq.org/doc/latest/manual/code-generation/data-type-
rewrites
我们已经讨论过,在早期版本的Fortran中,有两种real类型:默认的真实类型和double precision类型。 但是,Fortran 90/95通过kind规范提供了对实数和整数数据类型精度的更多控制。 种类属性 不同种类的数字以不同方式存储在计算机内。 kind属性允许您指定内部存储数字的方式。 例如, real, kind = 2 :: a, b, c real, kind = 4
问题内容: 我想知道为什么会出现此错误。(这是Eclipse调试的显示日志) 我不明白为什么我没有得到2.97! 问题答案: 如果需要,您应该已经习惯了。 s以分数形式存储在 二进制 而不是十进制中。因此,例如,仅存储为。 并且不能精确地表示为二进制分数,因此会有一些舍入误差。 您可能还会发现本文很有帮助。
https://github.com/camsong/blog/issues/9
问题内容: 我在Oracle 11g中将此列映射为NUMBER(21,20),在Hibernate中映射为: 对于该列的值为0.493的特定记录,我得到一个BigDecimal,其值为0.49299999999。似乎某处由于Double或Float转换而导致精度下降,但我无法通过以下简单的单元测试来跟踪精度: 使用Float,BigDecimal和各种构造函数的该代码的任何变体都会产生相同的结果:
问题内容: java中双值的乘法运算符的保证精度是多少? 例如,2.2 * 100是220.00000000000003,但是220是双精度数。220.00000000000003是220之后的下一个两倍。 问题答案: 乘法工作正常,但不能精确表示为双精度。最接近的双打是: 2.199999999999999733(0x4001999999999999) 2.200000000000000177(
问题内容: 浮点数是否具有32个二进制数字,而双精度数是否具有64个二进制数字?该文档太难理解了。 所有位都转换为有效数字吗?还是小数点的位置占用了一些位? 问题答案: float:32位(4个字节),其中23位用于尾数(约7个十进制数字)。指数使用8位,因此浮点数可以使用这8位将小数点“移动”到右边或左边。这样做避免了像0.0000003(3×10 -7)或3000000(3×10 7)那样在尾