oracle存储浮点数的一个bug?

在尝试将接近99999999.99999999的浮点数插入到平衡表中时,发现数值被四舍五入而非准确保存。本文探讨了这一现象的原因,并对比了不同数值插入时的表现。
部署运行你感兴趣的模型镜像
版本10.2.0

balance number(16,8).

insert into tablea(balance) values(99999999.99999999)
结果为100000000.00000000,居然也没报错。
insert into tablea(balance) values(trunc(99999999.99999999,8))
仍然为100000000.00000000,仍然没报错。

insert into tablea(balance) values(trunc(99999999.99999994,8))
结果为99999999.99999990。
insert into tablea(balance) values(99999999.99999994)
结果为99999999.99999990。

换个字段 ratio number(9,8)
insert into tablea(balance) values(9.99999999)
结果为9.99999999,这个是正常的。

也就是说,我存入不了99999999.99999999这个数,为啥要四舍五入啊。

为啥啊?

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

异或操作(XOR)**不适用于浮点数**,原因如下: --- ## ❌ 一、为什么不能对浮点数使用异或操作? ### 1. **异或是一种位运算** - 异或(`^`)是按位逻辑运算符,它要求操作数是整数类型。 - 浮点数(如 `float`、`double`)在计算机中是以 IEEE 754 格式存储的,其内部结构包含符号位、指数部分和尾数部分,并不是直接用于位运算的二进制序列。 ### 2. **C/C++ 等语言不允许直接对浮点数进行异或** - 在 C/C++ 中,如果你尝试对两个 `float` 或 `double` 类型变量执行异或操作,编译器会报错: ```c float a = 3.5, b = 2.0; float c = a ^ b; // 编译错误! ``` 因为异或只支持整数类型(如 `int`, `long`, `unsigned int` 等)。 --- ## ✅ 二、如果想对浮点数“模拟”异或操作,可以怎么做? 如果你确实需要对浮点数的二进制表示执行异或操作,可以通过以下方式实现: ### 方法:将浮点数强制转换为整数类型再进行异或 ```c #include <stdio.h> #include <stdint.h> int main() { float a = 3.5f; float b = 2.0f; // 将 float 转换为 uint32_t(假设是 32 位 float) uint32_t *a_bits = (uint32_t *)&a; uint32_t *b_bits = (uint32_t *)&b; uint32_t xor_result = *a_bits ^ *b_bits; // 如果需要,可以将结果转回 float(但通常没有实际意义) float result; *(uint32_t *)&result = xor_result; printf("Original floats: %f and %f\n", a, b); printf("XOR of their binary representations: %x\n", xor_result); printf("Converted back to float: %f\n", result); return 0; } ``` > ⚠️ 注意:这种方式是对浮点数的底层二进制表示进行异或,得到的结果并不等同于“数学意义上的浮点数异或”,而是其二进制形式的异或。这种操作在大多数情况下是没有意义的,除非你有特殊需求(如加密、调试、数据混淆等)。 --- ## 🧠 三、总结 | 项目 | 是否适用 | |------|----------| | 整数类型(int, long 等) | ✅ 可以 | | 浮点数(float, double) | ❌ 不可以 | | 字符串、布尔值等 | ❌ 不可以 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值