ปัดเศษเป็น Sig Sig รูปที่


20

ท้าทาย

รับตัวเลขxและตัวเลขnปัดเศษตัวเลขxที่nสำคัญและผลลัพธ์ผลลัพธ์

ตัวเลขสำคัญ

ตัวเลขสำคัญของตัวเลขคือตัวเลขที่มีความหมายซึ่งส่งผลต่อความละเอียดในการวัด ซึ่งรวมถึงตัวเลขทั้งหมดยกเว้นเลขศูนย์นำหน้า

โปรดจำไว้ว่าการนำศูนย์เป็นศูนย์หลังจุดทศนิยมยังคงเป็นตัวเลขที่ไม่สำคัญ

เมื่อปัดเศษตัวเลขคุณต้องปัดเศษออกจากศูนย์หากตัวเลขต่อไปนี้มากกว่าหรือเท่ากับห้า

ศูนย์ทั้งหมดต่อท้ายหลังจุดทศนิยมจะนับเป็นสำคัญ

อินพุต

หมายเลขแรกจะเป็นxตัวเลขที่จะปัดเศษ ตัวเลขที่สองจะเป็นnจำนวนตัวเลขสำคัญที่คุณควรปัดเศษxให้เป็น

xจะเป็นตัวเลข (รหัสของคุณควรจัดการทั้งจำนวนเต็มและคะแนนลอยตัว) ระหว่าง -1,000,000,000 ถึง 1,000, 000,000 nจะเป็นจำนวนเต็มบวกระหว่าง 1 ถึง 50 ที่ครอบคลุม nจะไม่มากกว่า nunber 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.สำคัญหรือไม่
Greg Martin

5
@ GregMartin ฉันเชื่อว่ามันเป็นเพราะนั่นเป็นสิ่งเดียวที่ทำให้มันมี 3 มะเดื่อมะเดื่อเทียบกับ 2
Suever

3
@BetaDecay ไม่มันไม่ได้ จะต้องใช้จุดทศนิยม
mbomb007

3
"200 ถือว่ามีเพียงหนึ่งรูปอย่างมีนัยสำคัญ" - chemistry.bd.psu.edu/jircitano/sigfigs.html
mbomb007

4
@DLosc นั่นเป็นเหตุผลว่าทำไมถ้านั่นเป็นผลลัพธ์ที่คุณจะเขียนเป็นจริง2.0 x 10^2, แสดง 2 sigfigs
mbomb007

คำตอบ:


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ตัวเลขที่มีนัยสำคัญดังนั้นจึงอนุญาตให้ใช้สำหรับกิจกรรมกอล์ฟนี้
Simon

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 Bytes ทำงานกับค่า <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 Bytes ใช้งานได้ แต่ข้ามศูนย์ที่ไม่จำเป็น

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

มีคนขโมยหรือลบฟังก์ชันรอบใน PHP! เพื่อให้การท้าทายน่าสนใจยิ่งขึ้น 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);

มันข้ามค่าศูนย์ที่ไม่เนรเทศด้วย มันเป็นรุ่นที่ฉันใช้ไม่ใช่ฟังก์ชั่น round native ใน PHP สำหรับเรื่องตลกเท่านั้น มันเป็นเวอร์ชั่น 56 Byte ที่ฉันต้องการ
JörgHülsermann

ตกลงถ้าไม่ใช้รอบห้องสมุด ....
RosLuP

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เลขศูนย์จะต่อท้ายเพื่อให้แน่ใจว่ามีตัวเลขเพียงพอที่จะปัดเศษจากนั้นจึงดึงตัวเลขnth และnตัวเลขแรก หากnตัวเลขหลักที่ไม่ได้ 4 หรือน้อยกว่านั้นเราจะเพิ่มลง1ในสตริงอย่างน่าเบื่อ หากสตริงมากเกินเราจะเพิ่มขนาดโดยนำหน้า a 1แต่ถ้ามันน้อยกว่าเดิมที่0.1เราทำโดยการลบ1เราเพิ่งเพิ่มและยัง0หลังจุดทศนิยม หากขนาดยังน้อยกว่า1เราจะคัดลอกศูนย์หลังจุดทศนิยมไปยังผลลัพธ์อย่างไรก็ตามถ้ามันเป็น1หรือมากกว่านั้นเราจะแยกส่วนจำนวนเต็มของคำตอบเพิ่มศูนย์พิเศษถ้าจำเป็นเพื่อให้ถึงจุดทศนิยม (ซึ่งก็คือ ลบอย่างที่มันจะแสดงความแม่นยำไม่ถูกต้อง) ในที่สุดสัญญาณ, ส่วนจำนวนเต็ม, จุดทศนิยมและส่วนทศนิยมจะถูกตัดแบ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.