gpt4 book ai didi

plsql - 优雅的 PL/SQL 来比较两个具有不同小数位数的数字

转载 作者:行者123 更新时间:2023-12-02 05:00:25 25 4
gpt4 key购买 nike

我需要一个函数来比较两个数字,以便 10.12432 = 10.12410.12432 != 10.123。也就是比较准确的数字需要按照不太准确的数字的小数点四舍五入。

以下函数似乎可以满足我的需要(根据 Noel 的评论编辑):

function eq(number_1 in number, number_2 in number) return boolean is
string_1 varchar2(100);
string_2 varchar2(100);

num_1 number;
num_2 number;

len number;
begin
string_1 := to_char(number_1, 'FM99999999999999999999999999999.99999999999999999999999999999');
string_2 := to_char(number_2, 'FM99999999999999999999999999999.99999999999999999999999999999');

string_1 := regexp_replace(string_1, '.*(\..*)', '\1');
string_2 := regexp_replace(string_2, '.*(\..*)', '\1');

len := least(length(string_1), length(string_2)) - 1;

num_1 := round(number_1, len);
num_2 := round(number_2, len);

return num_1 = num_2;

end eq;

但是,恕我直言,这并不是最令人满意的方法。是否有更好的解决方案,尤其是不求助于字符串的解决方案?

最佳答案

如果只是为了知道有多少位小数,您总是会用到一些字符串。一种使用最少字符串的解决方案是:

FUNCTION eq(number_1 in number, number_2 in number) return boolean is
dot1 NUMBER;
dot2 NUMBER;
min_places NUMBER;
BEGIN
dot1 := INSTR( number_1, '.' );
dot2 := INSTR( number_2, '.' );
IF( dot1 = 0 OR dot2 = 0 )
THEN
min_places := 0;
ELSE
min_places := NVL( LEAST( LENGTH( SUBSTR(number_1, dot1+1) )
, LENGTH( SUBSTR(number_2, dot2+1) )
), 0 );
END IF;
RETURN ROUND( number_1, min_places ) = ROUND( number_2, min_places );
END eq;

编辑:刚刚从您的示例中了解到要舍入的第二个参数。我之前使用的是 *POWER(10,min_places)。谢谢。

关于plsql - 优雅的 PL/SQL 来比较两个具有不同小数位数的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16830176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com