oracle计算mod(二进制浮点,0)的方法

oracle计算mod(二进制浮点,0)的方法,oracle,plsql,Oracle,Plsql,Oracle文档()说“MOD返回n2除以n1的剩余部分。如果n1为0,则返回n2。”。但当我在n2中放入一个二进制浮点数时,我得到了一个意外的结果(我认为应该是1.1,但得到了0) SQL> select mod(1.1,0), to_binary_float('1.1'), mod(to_binary_float('1.1'), 0) from dual; MOD(1.1,0) TO_BINARY_FLOAT('1.1') MOD(TO_BINARY_FLOAT('1.1'),0)

Oracle文档()说“MOD返回n2除以n1的剩余部分。如果n1为0,则返回n2。”。但当我在n2中放入一个二进制浮点数时,我得到了一个意外的结果(我认为应该是1.1,但得到了0)

SQL> select mod(1.1,0), to_binary_float('1.1'), mod(to_binary_float('1.1'), 0) from dual;

MOD(1.1,0) TO_BINARY_FLOAT('1.1') MOD(TO_BINARY_FLOAT('1.1'),0)
---------- ---------------------- -----------------------------
       1.1               1.1E+000                             0

有人知道吗?

有趣。我认为这与计算中内部使用的地板与圆形有关

例如,余数函数与mod非常相似,只是is使用了ROUND而不是FLOOR。对于本例,它将返回NAN(不是数字):

输出:

NAN
1.10000002384186
更有趣的是,如果返回NAN(在本例中,模拟MOD行为并返回1.1),我可以使用NANVL函数提供一个默认值,它将返回一个浮点值:

select nanvl(remainder(to_binary_float(1.1), 0), 1.1) from dual
输出:

NAN
1.10000002384186
所以也许这就是你的解决办法


希望这对你有所帮助

你有什么例外?很抱歉我的表达有误导性。这不是oracle抛出的真正错误。这是一个意外的返回值。我得到的是0而不是1.1。谢谢你的回答!您为我的特定场景提供了一个很好的替代方案,因此我对您的回答表示赞赏。但我想继续回答这个问题,因为我想知道根本原因。