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

实型值比较不正确

闾丘玺
2023-03-14
问题内容

REAL在db中有类型的字段。我使用PostgreSQL。和查询

SELECT * FROM my_table WHERE my_field = 0.15

返回行中的值my_field0.15

但是例如查询

SELECT * FROM my_table WHERE my_field > 0.15

正常工作。

如何解决此问题并获取行my_field = 0.15


问题答案:

解决 您的问题,请改用数据类型numeric ,该数据类型不是浮点类型,而是任意精度类型。

如果将数字文字
输入0.15numeric(相同的单词,不同的含义)列中,则会存储 确切的 数量-
与arealfloat8column列不同,在该列中,值被强制为下一个可能的二进制近似值。这可能是正确的,也可能不是确切的,具体取决于数量和实现的细节。十进制数字0.15恰好介于可能的二进制表示形式之间,并且以很小的错误存储。

请注意,计算结果本身可能是不精确的,因此=在这种情况下,请小心操作员。

这也取决于 如何 你测试。比较时,Postgres强制将各种数字类型转换为最能容纳结果的类型。考虑这个 演示

CREATE TABLE t(num_r real, num_n numeric);
INSERT INTO t VALUES (0.15, 0.15);

SELECT num_r, num_n  
      ,num_r = num_n       AS test1  --> FALSE!
      ,num_r = num_n::real AS test2  --> TRUE!
      ,num_r - num_n       AS result_nonzero  --> float8
      ,num_r - num_n::real AS result_zero     --> real
FROM  t;

SQL提琴。

因此,如果您已将0.15数字文字输入到数据类型的列中real,则可以使用以下命令找到所有此类行:

SELECT * FROM my_table WHERE my_field = **real '0.15'**

numeric如果需要精确存储小数位数,请使用列。



 类似资料:
  • 我读到这些方法返回值的规则是,对于obj1.compareTo(ob2),例如,如果ob2在层次结构中位于ob1之下,则返回值为负值,如果它位于ob1之上,则返回值为正(如果它等于,则返回值为0)。然而,在我的类中,我看到了使用Math.signum在compareTo方法中获得-1(表示负值)和1(表示正值)的示例。 有什么原因吗? 编辑: 以下是我的意思:

  • 我有一个问题,比较布尔值的if语句不起作用。最后一个if语句,其中notifFlag==true,如果我将它放在那里,它就不起作用了。日志显示notifFlag设置为true,但if语句未运行。但是,如果删除notifFlag==true,则if语句将运行。 带有标志得日志: 没有标志得日志:

  • 我用AIC比较了两个模型。但是,我意识到两个AIC值都太小了(-4752.66,另一个接近于那个)。我想知道这是正常的还是我在计算的时候做错了什么。

  • 问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正

  • 我需要写一个比较器,取一个a类型的对象a和一个B类型的对象B。这两个对象不是一个公共对象的扩展。他们确实是不同的,但我需要比较这两个对象在它的共同领域。我必须使用比较器接口,因为对象存储在Set中,之后我必须使用CollectionUtils进行操作。我搜索了一点点,我用比较器找到了解决方案,但只有相同的类型。 TXS 附注:我在不同的集合中添加两个对象: 之后我会这样想:

  • 我有以下课程: 这编译没有问题。但是,如果我尝试像这样内联变量: 我发现以下编译错误: 如何编写此表达式以使Java正确理解参数?