舍入为n个Sig图


20

挑战

给定一个数字x和一个数字n,将数字四舍五入xn有效数字并输出结果。

重要数字

数字的有效数字是带有含义的数字,有助于其测量分辨率。这包括前导零以外的所有数字。

请记住,小数点后的前导零仍然是微不足道的数字。

四舍五入一个数字时,如果以下数字大于或等于五,则必须四舍五入。

小数点后的所有尾随零均视为有效。

输入值

第一个数字为x,要舍入的数字。第二个数字将是n,您应舍入x到的有效数字数。

x将是介于-1,000,000,000到1,000,000,000(含)之间的数字(您的代码应同时处理整数和浮点数)。n将是介于1和50之间(含1和50)的正整数。n永远不会大于中的数字位数x

输入将永远不是0或任何形式0,例如0.000000

例子

Inputs: 2.6754, 2
Output: 2.7

的输出2.7000将无效,因为小数点后的零将被视为有效数字。


Inputs: 0.00034551, 4
Output: 0.0003455

Inputs: 50237.1238, 3
Output: 50200

请注意,它不能有小数点。


Inputs: 2374905, 1
Output: 2000000

Inputs: 543.0489, 4
Output: 543.0

Inputs: 15, 1
Output: 20

Inputs: 520.3, 3
Output: 520

如果您愿意,可以520.改为输出,但不能输出520.0


Inputs: -53.87, 2
Output: -54

Inputs: 0.0999, 2
Output: 0.10

规则

不允许使用内置的函数和库将n数字四舍五入为有效数字。

获奖

以字节为单位的最短代码获胜。


4
对于Inputs: 520.3, 3,答案中的小数点520.不重要吗?
格雷格·马丁

5
@GregMartin我相信是的,因为那是唯一让它有3个无花果vs. 2的方式
Suever

3
@BetaDecay不,不是。为此需要小数点。
mbomb007

3
“200被认为只有一个显著人物” - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLosc这就是为什么如果要这样的结果,您实际上将其写为2.0 x 10^2,显示了2个sigfig。
mbomb007

Answers:


3

Python 3,83个字节

(类似于PHP的答案)

from math import *
def s(x,n):
 y=10**(ceil(log10(abs(x)))-n)
 return y*round(x/y)

测试用例:

tests = [(2.6754,2), (0.00034551, 4), (50237.1238, 3),
        (2374905, 1), (543.0489, 4), (15, 1), (520.3, 3), (-53.87, 2)]

print ([s(x,n) for x,n in tests])

输出:

[2.7, 0.0003455, 50200, 2000000, 543.0, 20, 520, -54]

除了稍长一点,我考虑了另一种方法:

from math import *
def s(x,n):
 z=ceil(log10(abs(x)))
 return "%.*f"%(n-z,10**z*round(x/10**z,n))

...对于(15,1)的输入产生错误的输出:

['2.7', '0.0003455', '50200', '2000000', '543.0', '10', '520', '-54']

...由于round()函数中的浮点不精确性。在我看来,如果我足够努力的话,我可能会找到打破“四舍五入到小数位”方法的测试用例。

因此,在我看来,我的解决方案在所有情况下可能都不是100%正确的,除非以十进制计算,否则不会。因此,此问题可能会影响使用FP算术的任何语言的解决方案。


通过将正文s放在同一行上,然后使用分号来节省一些字节。def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
Cyoce

此外,您还可以删除的空间import *,使其import*
Cyoce

您对我的回答并不正确,因为规则说:“不允许使用允许将数字四舍五入到n个有效数字的内置函数和库。” 并且您使用n = 0的舍入函数
RosLuP

@RosLuP:该round()函数四舍五入到n小数点后一位,而不是n有效数字,因此此高尔夫比赛允许使用该函数。
西蒙

5

PHP,130字节

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-ceil(log(abs($i),10))),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP,133字节有效数字的值<1

<?=number_format($r=round($i=$argv[1],($n=$argv[2])-floor(log(abs($i),10))-1),($d=(1+floor(log(abs($r),10))-$n))<0?abs($d):0,".","");

PHP,56字节有效,但跳过不必要的零

<?=round($i=$argv[1],$argv[2]-floor(log(abs($i),10))-1);

有人窃取或删除了PHP中的round函数!使挑战变得更加有趣。127字节

<?=ceil($x=($i=$argv[1])*10**(($r=$argv[2])-($l=floor(log(abs($i),10))+1)))-$x<=0.5?ceil($x)*10**($l-$r):floor($x)*10**($l-$r);

它也会跳过不必要的零点。在这个版本中,我不仅仅在玩笑中使用PHP中的本机回合函数。它属于56字节的版本,我宁愿
约尔格Hülsermann

好吧,如果不使用图书馆回合的话....
RosLuP '18

3

分批,660个 652字节

@echo off
set m=%1.
set s=
if %m:~,1%==- set s=-&set m=%m:~1%
:m
if %m:~,1%==0 set m=%m:~1%&goto m
set d=%m:.=%
:d
if %d:~,1%==0 set d=%d:~1%&goto d
for /l %%i in (1,1,%2) do call set d=%%d%%0
call set r=%%d:~%2,1%%
call set d=%%d:~,%2%%
if %r% leq 4 goto r
set r=
:i
set/ai=1+%d:~-1%
set r=%i:~-1%%r%
set d=%d:~,-1%
if %i% leq 9 set d=%d%%r%&goto r
if not "%d%"=="" goto i
set d=1%r:~1%
set m=1%m%
set m=%m:1.0=.%
:r
if %m:~,2%==.0 set m=%m:.0=.%&set d=0%d%&goto r
set i=0
set p=.
:l
if %m:~,1%==. echo %s%%i%%p%%d%&exit/b
if %i%==0 set i=
if "%d%"=="" set d=0&set p=
set i=%i%%d:~,1%
set d=%d:~1%
set m=%m:~1%
goto l

说明:.如果参数尚无后缀,请在参数后缀a 开头,然后修剪符号(已保存)和任何前导零。将结果变量m保存起来以备后用,因为它将告诉我们结果的期望大小。任何.s的然后取出,这可能导致进一步的前导零,所以他们被删除了。n给零加后缀以确保有足够的数字可以舍入,然后提取n第一个和第一个n数字。如果nth位不是4或更少,那么我们将繁琐地添加1到字符串中。如果字符串溢出,则我们通过在前面加上a来增加幅度1,但如果原先小于0.1我们的大小,则通过删除1我们刚添加的a和一个0小数点后。如果幅度仍小于1小数,则将小数点后的零复制到结果中,但是如果大于或等于小数,1或更多,然后我们提取答案的整数部分,并在必要时添加额外的零以达到小数点(然后将其删除,因为这将显示不正确的精度)。最后,将符号,整数部分,小数点和小数部分连接在一起。

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.