- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
MySQL版本是5.66.22
当我对存储在 varchar 中的十进制数字使用 ROUND
函数时,我发现所有 .5 数字都有奇怪的行为
Select round(0.5)
1
Select round('0.5')
0
Select round('26.5' + 0.00)
26
但是
Select round(1.5)
2
Select round('1.5')
2
Select round(0.55, 1)
0.6
Select round('0.55', 1)
0.6
我检查了 Oracle DB (12c) 中的 ROUND 函数,它按预期工作
Select round('0.5') from dual
1
Select round(0.5) from dual
1
有人知道怎么解释吗?
所描述的 mysql round() 函数行为导致应用程序中出现“舍入”问题。为了解决我使用的问题:
Select round (CAST('0.5' AS DECIMAL(10,2)))
1
我知道在 varchar 中存储数字是糟糕的设计,但是这个应用程序是很久以前写的,现在没有人想重构代码
最佳答案
很有趣。该行为可以解释如下:
1) MySQL 在数字上下文 (ref) 中使用时将字符串转换为浮点值:
CREATE TABLE test AS (
SELECT 0.5, '0.5' * 1 AS str_to_numeric
);
DESCRIBE test;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| 0.5 | decimal(2,1) | NO | | 0.0 | |
| str_to_numeric | double | NO | | 0 | |
+----------------+--------------+------+-----+---------+-------+
2) 如手册中所述:
The
ROUND()
function rounds differently depending on whether its argument is exact or approximate:
For exact-value numbers,
ROUND()
uses the “round half up” rule: A value with a fractional part of .5 or greater is rounded up to the next integer if positive or down to the next integer if negative. (In other words, it is rounded away from zero.) A value with a fractional part less than .5 is rounded down to the next integer if positive or up to the next integer if negative.For approximate-value numbers, the result depends on the C library. On many systems, this means that
ROUND()
uses the “round to nearest even” rule: A value with any fractional part is rounded to the nearest even integer.
下面是一些说明 ROUND 函数最终行为的测试:
CREATE TABLE test(
fix DECIMAL(10,2),
arb DOUBLE
);
INSERT INTO test(fix, arb) VALUES
(0.5, 0.5),
(1.5, 1.5),
(2.5, 2.5),
(3.5, 3.5);
SELECT fix, ROUND(fix) fix_roundex, arb, ROUND(arb) arb_rounded
FROM test
+------+-------------+------+-------------+
| fix | fix_roundex | arb | arb_rounded |
+------+-------------+------+-------------+
| 0.50 | 1 | 0.5 | 0 |
| 1.50 | 2 | 1.5 | 2 |
| 2.50 | 3 | 2.5 | 2 |
| 3.50 | 4 | 3.5 | 4 |
+------+-------------+------+-------------+
您的解决方案(将数字字符串显式转换为 DECIMAL
)是正确的。
关于用于存储在字符串中的小数的 MySQL Round() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50063590/
Stata 有一个 round() 函数。人们可以选择舍入到的单位。我想使用round(ArbitraryValue, 0.01)将任意浮点值四舍五入到小数点后两位。 Stata 的 display
四舍五入看起来很容易,但我不知道如何四舍五入。 使用这段代码: def __str__(self): return'x = %.2f,y = %.2f'%(self.x,self.y)
我发现一个很奇怪的问题,问题是PHP和Javascript中的ROUND方法计算结果不一样!? 请看下面的例子: PHP echo round(175.5); // 176 echo round(-1
让我们看一下那句令人震惊的round语句: >>> round(2.675, 2) 2.67 我知道为什么回合“失败”;这是因为 2.675 的二进制表示: >>> import decimal >>
这个问题已经有答案了: 奥 git _a (1 个回答) 已关闭 7 年前。 我发现 VBA Round 函数返回错误的结果。我找到了一个可行的替代方案,即使用 Application.Round 代
所以我正在运行 MySQL 5.1.4 版,我试图通过四舍五入的值来选择 distinct,它工作得很好,除了它把数字四舍五入,比如 12.5 到 12 而不是 13。我试过的列都是double型的。
guess = input("H or T?") def game(): num_rounds() for p1 in range(0, 2): p1 = ("H",
我了解到建议使用 BigDecimal 而不是 Float,但这要么是一个错误,要么突出了 Float 的深奥本质.似乎 Float#round(2) 对“1.015”、“1.025”和“1.035”
C# 中的 Math.Round 和 decimal.Round 函数有什么区别? 最佳答案 没有区别。 Math.Round(decimal)源代码: public static Decimal R
我注意到 Math.Round()比 Decimal.Round() 更灵活,因为它能够处理 Decimal.Round() 可以处理的所有事情,而且在给定 double 输入的情况下也可以处理同样的
我在生成的 SVG 中看到一个奇怪的渲染问题。我已经把它缩小到一个小的可重复的案例。 这呈现为 (至少在 Safari、Mac Chrome 或 Mac Firefox 中查看时)。我希望
我有以下 SQL Server 语句,我想将其转换为 c#。我知道 C# 中有一个叫做 Math.Round 的东西。我已经尝试过,但 C# 返回相同的结果 c# 返回一个 int。有关详细信息,请查
我正在使用 C# 和 SQL 中的 ROUND 函数,令人惊讶的是两者都产生了不同的结果。 在 SQL 中:ROUND(1250.00, -2) = 1300 在 C# 中 ROUND 1250 ro
我正在尝试使用 SSE(1,2,3) 指令创建类似于 std::round() 的函数,但某些值和/或逻辑运算符存在一些问题。这是我的代码: #include #include #include
jq 中的 round 函数不起作用。 $ jq '10.01 | round' jq: error: round/0 is not defined at , line 1: 10.01 | roun
我试图弄清楚如何使用 VBA 更改 Excel 中圆角矩形形状的圆度。 我首先创建圆角矩形,但此时我不确定下一步要做什么。 Set roundedRec = ws.Shapes.AddShape(ms
当我的代码运行时,我进入 2 人模式并调用函数 rounda 和 roundb,但由于某种原因它们没有响应。其他一切都正常,但我不知道出了什么问题。预先感谢您提供任何可能的建议。我的代码如下。我调用函
我从阅读中知道this Stackoverflow question编译器将查看您的数字,确定中点是偶数还是奇数,然后返回偶数。示例数字是 2.5,四舍五入为 3。我尝试了自己的小实验以查看会发生什么
这个问题在这里已经有了答案: There's a shadow on my button (3 个答案) 关闭 9 年前。 顺便说一句。它可能看起来像是关于按钮阴影问题的重复问题,但它们具有单调背景
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
我是一名优秀的程序员,十分优秀!