当前位置: 首页 > 面试题库 >

JOOQ Oracle Number精度和Java数字映射

常俊侠
2023-03-14
问题内容

任何人都可以告诉我或提供对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通常用作“数据库优先” API
  • 大多数数据是从数据库读取的,而不是写入数据库的

默认行为

在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)那样在尾