如何平均四舍五入到PostgreSQL的2位小数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何平均四舍五入到PostgreSQL的2位小数相关的知识,希望对你有一定的参考价值。

ostgreSQL没有定义round(double precision, integer)。至于原因, 嘘声解释了一轮,需要一个精确的版本仅适用于numeric。
regress=> SELECT round( float8 \'3.1415927\', 2 );
ERROR: function round(double precision, integer) does not exist
regress=> \\df *round*
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+--------
pg_catalog | dround | double precision | double precision | normal
pg_catalog | round | double precision | double precision | normal
pg_catalog | round | numeric | numeric | normal
pg_catalog | round | numeric | numeric, integer | normal
(4 rows)
regress=> SELECT round( CAST(float8 \'3.1415927\' as numeric), 2);
round
-------
3.14
(1 row)
(在上面的,请注意float8仅仅是一个速记别名double precision。你可以看到,PostgreSQL的正在扩大它在输出)。 你必须转换值被舍入到numeric两种表单的round。只是追加::numeric对于速记投,像round(val::numeric,2)。 如果你格式化显示给穿上\'round。使用to_char(参见:本手册中的数据类型格式化函数),它可以让你指定格式,并给你一个text这是不会受到任何的怪事你的客户端端语言的结果可能跟numeric值。例如:
regress=> SELECT to_char(float8 \'3.1415927\', \'FM999999999.00\');
to_char
---------------
3.14
(1 row)
to_char将数字四舍五入为你作为格式化的一部分。该FM前缀告诉to_char你不想与前导空格任何填充。
参考技术A 如何平均四舍五入到PostgreSQL的2位小数
select round(1.2345,2);round函数,第一个参数必须是numeric类型,第二个参数是保留几位小数

将十进制数截断为最接近的 4 位小数并断言

【中文标题】将十进制数截断为最接近的 4 位小数并断言【英文标题】:truncate a decimal number to nearest 4 decimals and assert 【发布时间】:2017-09-07 13:55:45 【问题描述】:

如何将带有 4 个小数点的浮点数四舍五入并在断言中使用它。我正在通过两种方法计算样本的平均值,并希望通过断言来比较它们。由于第 6 位小数点的平均值不同(这没问题),我得到一个断言错误。

是否可以截断最后 2 个小数点,或者只接受前 4 个小数点。

如我所见,std::precision 等大多数命令都是用于输入输出操作。 std::numeric_limits的意义是什么?

我有一个解决方法,当我将浮点数乘以 10000 并将数字取底。这行得通,但适当的解决方案会有所帮助。

float  mean, mean_x;
mean = 1.123456;
mean_x = 1.123499;
assert(std::floor(mean*10000) == std::floor(mean_x*10000));

【问题讨论】:

懒惰,我会简单地将float 转换为std::string 并手动减少到n 有效数字,但这不会很有效。你的 atm 可能更好 您可以减去数字并验证差异是否足够小。 @BoPersson 的建议可以用std::abs(mean - mean_x)<1e-4 来实现(abs from cmath 【参考方案1】:

您不能将 float 舍入到特定精度作为小数位数,因为在内部浮点值是 ∑ (bi/2i) 值与 i 对于 float 为 1..24(当平台确实使用 IEEE 754 标准浮点实现时)。因此,例如 1/1024 = 0.0009765625 => 你可能需要这个来通过 cca 调整第四个十进制数字。 +-9,但它也会在第四位之后添加更多小数位。

这就是为什么 OUTPUT 被格式化(四舍五入)为特定数量的十进制数字,但值保持不变。

在单元测试中,通常有专门用于浮点值比较的特殊断言,它有进一步的参数 epsilon,指定要容忍的最大值差异(在你的情况下 1e-4 可以)。

如果你不使用一些带有大量断言的单元测试框架,你可以使用史蒂夫的建议(这是这种浮动断言的实现):

// assert that the difference is smaller than 0.0001
assert(std::abs(mean - mean_x) < 1e-4);  // (abs from cmath) 

有关float 工作原理的相关文档(在大多数平台上): What Every Programmer Should Know About Floating-Point Arithmetic

【讨论】:

呃,这个论点是有缺陷的,但它是关于二阶错误的二阶错误;)。在这种情况下,可以检查相对差异是否小于 0.000099999784 而不是小于 0.0001。

以上是关于如何平均四舍五入到PostgreSQL的2位小数的主要内容,如果未能解决你的问题,请参考以下文章

C语言四舍五入保留两位小数

C语言四舍五入保留两位小数

如何把java得出的数值,保留小数点2位四舍五入

SQL如何将整数值四舍五入到小数点后2位

Android-四舍五入到小数点后2位[重复]

如何获取数组的平均值并对MongoDB中的结果进行四舍五入