圆像零


12

目标

给定输入数字,将其四舍五入到一个有效数字。

要求

输入值

  • 浮点数。
  • 假设输入数字的结果在数据类型的限制之内(即忽略溢出错误)。
  • 0是无效输入。
  • 不必支持不能以浮点数据类型准确表示的数字(例如"0.35",存储为0.3499999)。

输出量

  • 由一个非零数字和任意数目的零数字组成的最接近的数字。
  • 结果必须支持负数和小数。
  • 当输入恰好位于两个可能的输出之间时,请从零舍入。

介绍

重点是计算而不是表示。输出可以是浮点数据类型。它可以是完整或科学计数形式的文本。如果您发现一个漏洞,可以通过某种方式减少字节数,这对您来说是荣誉!

例子

9
-3000
.2
0.2
-.2
7e12
5e-15
1e0

测试用例

Input     Output
1         1
10        10
17        20
99        100
54321     50000
56789     60000
-123      -100
-789      -800
0.23      0.2
0.25      0.3
-0.25     -0.3
4.56e23   5e23
4.56e-23  5e-23

计分

一周后字节数最少的代码将获胜。


3
我认为您正在寻找“一个重要的数字”。
史蒂夫·本内特

2
0的舍入规则很奇怪。
xnor

2
@xnor,你是对的。0比1更接近0.0001。我认为0应该只是无效的。
Hand-E-Food

1
是的,它与目标陈述不符。
史蒂夫·本尼特

Answers:


6

MATL,3个字节

1&V

在线尝试!验证所有测试用例

0.25对于在TIO上的Octave中运行的编译器,测试用例失败,但在Windows上的Matlab中可运行:

在此处输入图片说明

不同的行为是由Octave / Matlab sprintf函数使用“银行家舍入”或“ .5远离零”舍入引起的,具体取决于平台。更多信息和测试可以在这里找到。


对于6个字节

1t3$Yo

在Octave和Matlab上均可使用。验证所有测试用例


1
“银行家四舍五入”几乎使我删除了Jelly答案。> _ <
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer是的,我也知道这也是原因。我很幸运Matlab没这么做:-D
Luis Mendo


9

Javascript,19个字节

x=>x.toPrecision(1)

这不符合0或上的规范25
Anders Kaseorg '17

有趣。的规范对0我来说没有意义。但是,0.35事情……看起来Javascript试图避免舍入过程中的偏差,但是规范需要这种偏差。
史蒂夫·本内特

嘿,您更改了评论-您之前0.35没有写过25。我认为它确实满足25的规格-它返回“ 3e + 1”,对我来说似乎正确。
史蒂夫·本内特

抱歉,0.35由于0.35没有确切的浮点表示形式,我将其更改为。该行为必须与浏览器相关;我在Firefox中得到252e+1
Anders Kaseorg '17

是的,我在Chrome和Firefox中得到了两种不同的结果。哇。
史蒂夫·本内特

4

视网膜63 62字节

1`[1-9]
$*#
#\.?[5-9]
#$&
T`d`0`#[\d.]+
0(\.?)#{10}
1$1
#+
$.0

在线尝试!


显然,您不必担心尾随零,因此您可以完全删除最后一个阶段(尽管给我留下了深刻的印象,并不是每天都在四个字符的间隔中看到三个问号)。
尼尔

不幸的是,这个答案似乎失败了0.99
尼尔

也因其他原因而失败0.099。我尝试修复:在线尝试!
尼尔

也会因... 失败99.99100.001
尼尔(Neil)

还是错了0.099,抱歉。在光明的一面,我认为你可以删除+后,;在第三行。
尼尔

2

PHP,45字节

<?=round($x=$argv[1],-floor(log10(abs($x))));

在线尝试!

与我的python 2答案相同的方法。

似乎也可以正确处理0.35,这也使它在JS答案上方钉住了:D


有趣的是,我觉得你删除的Python 3答案可能在Python 2.工作
安德斯Kaseorg

经过测试,可以!立即编辑和
取消

2

T-SQL,27个字节

SELECT FORMAT(i,'G1')FROM t

使用与Carlos Alejo的C#answer相同的.Net格式代码。输入是从浮动在预先存在表根据我们的IO标准

测试用例:

Input         Output
------------ --------
1             1
10            1E+01
17            2E+01
99            1E+02
54321         5E+04
56789         6E+04
-123         -1E+02
-789         -8E+02
0.23          0.2
0.25          0.3
-0.25        -0.3
4.56E+23      5E+23
4.56E-23      5E-23

(非常方便,我可以将所有这些值预加载到输入表中并立即运行它们。)


1

Python 2,62个字节

lambda x:round(x,-int(floor(log10(abs(x)))))
from math import*

在线尝试!

以前不习惯python打高尔夫球,但是可以。

0.35由于浮点数错误而失败。

感谢Anders Kaseorg指出这可以在Python 2中正常工作


的输出0.25应该是0.3
Anders Kaseorg '17

@AndersKaseorg我不确定为什么,但是我只能假设这是由于与Javascript答案相同的浮点数错误。
Skidsdev

嗯,等待25有同样的问题...很奇怪。
Skidsdev

对于任何想知道的人,Python 2的round取整都从零取整,而Python 3的取整取整为偶数,这就是为什么它在Py2中有效,但在3中
不起作用。– flornquake

您可以使用log(x,10)代替来打几字节log10(abs(x))
艾力克斯·艾森哈特


1

Excel,14个字节

=ROUNDUP(A1,1)

欢迎光临本站!这是一个很好的第一答案,您是否有任何指向可以测试的地方的链接,最好是在线链接,以便其他用户不必下载Excel?
caird coinheringaahing

不幸的是,抱歉,我认为没有免费的Microsoft网站。我已经在Code Golf上看到了其他Excel答案,但是由于我是新手,所以我不确定如何验证这些答案!
REW

对于大多数测试用例来说,这是行不通的。四舍五入到“十分之一”的位置。它需要四舍五入(而不是向上舍入)到最重要的位置。
Hand-E-Food



0

第四(gforth),24字节

: f 1 set-precision f. ;

在线尝试!

预期在浮点堆栈上输入。输出到标准输出

我不喜欢更改浮点输出函数的全局精度(对于此例),但是它节省了很多字节,不必在最后恢复以前的值。无论输入什么,都不会以工程或科学计数法输出。

注意:由于某种原因,tio解释器会转换0.250.2,而我的本地安装会转换0.250.3。我不确定为什么会这样,但是由于我在本地得到了正确的结果,因此我将原样保留我的答案

: f                   \ start a new word definition
  1 set-precision     \ set the floating point output words to use 1 significant digit
  f.                  \ output the top of the floating point stack
;                     \ end the word definition
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.