四舍五入到小数点后 4 位,但在 MS SQL Server 中输出显示 4 个小数位 + 4 个 0

问题描述 投票:0回答:12

我正在 HackerRank 中的 Weather Observation Station 17 工作。 查询 STATION 中最小北纬度 (LAT_N) 大于 38.7780 的西经度 (LONG_W)。将您的答案四舍五入到小数点后 4 位。

表:STATION 字段:ID、城市、州、LAT_N、LONG_W 其中 LAT_N 是北纬,LONG_W 是西经。

我的代码:

SELECT ROUND(LONG_W,4,0) AS low
FROM STATION
WHERE LAT_N = (SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780);

输出: 70.13780000 答案是错误的。我在网上查了这个问题,代码在其他答案中看起来是一样的。我正在使用 MS SQL Server。 相同的代码在 MySQL 上运行良好

sql sql-server numbers decimal
12个回答
2
投票

ROUND
函数将返回与输入相同的数据类型、精度和小数位数:

select round(1.10045001, 4); -- 1.10050000
select round(1.10055001, 4); -- 1.10060000

您需要

CAST(... AS DECIMAL(..., 4))
来生成正好 4 位的小数。该函数将在转换过程中使用与
ROUND
相同的算法对值进行四舍五入:

select cast(1.10045001 as decimal(18, 4)); -- 1.1005
select cast(1.10055001 as decimal(18, 4)); -- 1.1006

1
投票

我只是不会使用

ROUND

SELECT CONVERT(decimal(12,4), LONG_W) AS low
FROM STATION
WHERE LAT_N = (SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780);

也更高效:

SELECT TOP (1) CONVERT(decimal(12,4), LONG_W) AS low
FROM STATION
WHERE LAT_N > 38.7780
ORDER BY LAT_N;

0
投票

对于 MS SQL

SELECT CAST(LONG_W AS DECIMAL(10, 4))
FROM STATION
WHERE LAT_N = ( SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780);

0
投票

MS SQL 服务器:

从车站选择前 1 个 CAST(LONG_W AS DECIMAL(10,4)) 哪里 LAT_N > 38.7780 按 LAT_N ASC 排序


0
投票
SELECT FORMAT(round(min(LAT_N),4),'F4')
FROM STATION
WHERE LAT_N > 38.7780;


Your Output (stdout)
38.8526

0
投票

实际上这个问题有点令人困惑,但在得到正确答案后我还是明白了一些含义。

LAT_N 的条件令人困惑,这意味着

LAT_N is smallest one and the same time LAT_N is greater than 38.7780

select round(LONG_W,4) from STATION where LAT_N = (SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780);

stdout: 70.1378


0
投票

这应该有效。有多个 lat_n 值大于 38.7780。然而,我们想要其中最小的一个,以及对应的long_w。因此,要获得最小的 lat_n,请按 lat_n 对结果进行排序并将限制设置为 1。这将获取最小的 lat_n 值。

SELECT ROUND(long_w, 4)
FROM station
WHERE lat_n > 38.7780
ORDER BY lat_n
LIMIT 1;

0
投票
SELECT CAST(ROUND(LONG_W,4) AS DECIMAL(10, 4)) 
FROM STATION WHERE LAT_N = ( SELECT MIN(LAT_N) FROM STATION WHERE LAT_N > 38.7780);

这会起作用..


0
投票

我的代码在 MYSQL 上成功运行

select round (LONG_W,4)
from STATION
where LAT_N>38.7780
order by LAT_N asc
limit 1;

0
投票

这是 MYSQL 中这个问题的正确答案

select round (LAT_N,4)
from STATION
where LAT_N>38.7780
order by LAT_N asc
limit 1;

0
投票

MS SQL 的解决方案 - 避免四舍五入数字后尾随 0 的最佳方法(例如 452.05 与 452.050000)是使用类似

CAST AS DECIMAL
的格式。对于 MS SQL,我们需要使用“TOP”,但对于 MySQL,则为
LIMIT

/*use of CAST function*/
select top 1 cast(long_w as decimal(10,4)) from station
where lat_n > 38.7780 order by lat_n asc

输出将是

70.1378

0
投票

HackerRank 中的 17 号天气观测站。查询 STATION 中最小北纬度 (LAT_N) 大于 38.7780 的西经度 (LONG_W)。将您的答案四舍五入到小数点后 4 位。

表:STATION 字段:ID、CITY、STATE、LAT_N、LONG_W,其中 LAT_N 是北纬,LONG_W 是西经。

从车站选择round(long_w,4) 按 lat_n 分组 最小(lat_n)>38.7780

谁能告诉我为什么这会给出运行时错误而不是正确的答案

© www.soinside.com 2019 - 2024. All rights reserved.