Tròn như số không


12

Mục tiêu

Cho một số đầu vào, làm tròn nó đến số gần nhất với một con số đáng kể.

Yêu cầu

Đầu vào

  • Một số dấu phẩy động.
  • Giả sử kết quả số đầu vào trong một đầu ra trong giới hạn của kiểu dữ liệu (ví dụ: bỏ qua lỗi tràn.)
  • 0 là một đầu vào không hợp lệ.
  • Các số không thể được biểu diễn chính xác trong kiểu dữ liệu dấu phẩy động (ví dụ: "0.35"được lưu trữ dưới dạng 0.3499999) không phải được hỗ trợ.

Đầu ra

  • Số gần nhất bao gồm một chữ số khác không và bất kỳ số chữ số 0 nào.
  • Kết quả phải hỗ trợ số âm và số phân số.
  • Khi đầu vào nằm chính xác giữa hai đầu ra có thể, làm tròn từ 0.

Trình bày

Trọng tâm là tính toán hơn là trình bày. Đầu ra có thể là một kiểu dữ liệu dấu phẩy động. Nó có thể là văn bản đầy đủ hoặc ký hiệu khoa học. Nếu bạn tìm thấy một lỗ hổng trong đó trình bày một cách nhất định làm giảm số lượng byte của bạn, danh tiếng cho bạn!

Ví dụ

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

Các trường hợp thử nghiệm

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

Chấm điểm

Mã có số byte ít nhất sau một tuần sẽ thắng.


3
Tôi nghĩ rằng "một con số đáng kể" là cụm từ bạn đang tìm kiếm.
Steve Bennett

2
Quy tắc làm tròn cho 0 là khá kỳ lạ.
xnor

2
@xnor, bạn nói đúng. 0 gần với 0,0001 hơn 1. Tôi nghĩ đơn giản là 0 không hợp lệ.
Thực phẩm điện tử

1
Vâng, và nó không phù hợp với tuyên bố mục tiêu.
Steve Bennett

Câu trả lời:


6

MATL , 3 byte

1&V

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Trường hợp thử nghiệm 0.25không thành công cho trình biên dịch chạy trong Octave trên TIO, nhưng hoạt động trong Matlab trên Windows:

nhập mô tả hình ảnh ở đây

Hành vi khác nhau được gây ra bởi sprintfchức năng của Octave / Matlab bằng cách sử dụng "làm tròn ngân hàng" hoặc làm tròn "0,5 từ số 0", tùy thuộc vào nền tảng. Thêm thông tin và kiểm tra có thể được tìm thấy ở đây .


Đối với 6 byte ,

1t3$Yo

hoạt động cả trên Octave và Matlab. Xác nhận tất cả các trường hợp thử nghiệm .


1
"Làm tròn ngân hàng" là khá nhiều thứ khiến tôi xóa câu trả lời Jelly của mình. > _ <
Erik the Outgolfer 20/07/17

@EriktheOutgolfer Vâng, tôi đã hiểu rằng đó cũng là lý do. Tôi may mắn vì Matlab không làm điều đó :-D
Luis Mendo


9

Javascript, 19 byte

x=>x.toPrecision(1)

Điều này không đáp ứng các đặc điểm kỹ thuật trên 0hoặc 25.
Anders Kaseorg

Hấp dẫn. Thông số kỹ thuật 0không có ý nghĩa với tôi. Nhưng 0.35điều ... có vẻ như Javascript đang cố gắng tránh sự thiên vị trong làm tròn, nhưng thông số kỹ thuật muốn có sự thiên vị.
Steve Bennett

Hey, bạn đã thay đổi nhận xét của bạn - bạn đã viết 0.35không 25hết. Tôi nghĩ rằng nó đáp ứng thông số kỹ thuật cho 25 - nó trả về "3e + 1" có vẻ đúng với tôi.
Steve Bennett

Xin lỗi, tôi đã thay đổi nó từ 0.350.35không có biểu diễn dấu phẩy động chính xác. Hành vi phải phụ thuộc vào trình duyệt; Tôi nhận được 252e+1trong Firefox.
Anders Kaseorg

Phải, tôi nhận được hai kết quả khác nhau trong Chrome vs Firefox. Ồ
Steve Bennett

4

Võng mạc , 63 62 byte

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

Hãy thử trực tuyến!


Rõ ràng bạn không phải lo lắng về các số 0 ở cuối để có thể loại bỏ hoàn toàn giai đoạn cuối (mặc dù tôi rất ấn tượng với nó, nhưng không phải ngày nào bạn cũng thấy ba dấu hỏi trong không gian của bốn ký tự).
Neil

Thật không may, câu trả lời này dường như không thành công 0.99.
Neil

Cũng thất bại cho 0.099... Cố gắng của tôi tại một sửa chữa: Hãy thử trực tuyến!
Neil

Cũng thất bại vì 99.99, 100.001...
Neil

Vẫn sai vì 0.099xin lỗi. Về mặt tươi sáng, tôi nghĩ rằng bạn có thể loại bỏ +sau ;dòng thứ ba.
Neil

2

PHP , 45 byte

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

Hãy thử trực tuyến!

Phương pháp tương tự như câu trả lời python 2 của tôi.

Cũng có vẻ xử lý chính xác 0.35, điều này cũng đặt nó lên trên câu trả lời của JS: D


Thật thú vị, tôi nghĩ rằng câu trả lời Python 3 đã xóa của bạn có thể hoạt động trong Python 2.
Anders Kaseorg

Đã thử nghiệm, và nó làm! Đã chỉnh sửa và xóa bỏ câu trả lời của con trăn ngay bây giờ
Skidsdev

2

T-SQL, 27 byte

SELECT FORMAT(i,'G1')FROM t

Sử dụng cùng mã định dạng .Net như câu trả lời C # của Carlos Alejo . Đầu vào là từ cột float i trong bảng t có sẵn , theo tiêu chuẩn IO của chúng tôi

Các trường hợp thử nghiệm:

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

(Khá tiện lợi khi tôi có thể tải trước bảng đầu vào với tất cả các giá trị này và chạy chúng cùng một lúc.)


1

Python 2 , 62 byte

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

Hãy thử trực tuyến!

Không được sử dụng để chơi golf trăn, nhưng điều này hoạt động.

Thất bại 0.35do không chính xác điểm nổi.

Cảm ơn Anders Kaseorg đã chỉ ra rằng điều này hoạt động chính xác trong Python 2


Đầu ra cho 0.25được cho là 0.3.
Anders Kaseorg

@AndersKaseorg Tôi không chắc tại sao, nhưng tôi chỉ có thể cho rằng đó là do sự thiếu chính xác của dấu phẩy động giống như câu trả lời Javascript.
Skidsdev

Hmm chờ 25 có cùng một vấn đề ... kỳ lạ.
Skidsdev

Đối với bất kỳ ai thắc mắc, Python 2 làm roundtròn từ 0 trong khi Python 3 làm tròn, đó là lý do tại sao điều này hoạt động ở Py2 chứ không phải 3.
flornquake

bạn có thể chơi vài byte bằng cách sử dụng log(x,10)thay vì log10(abs(x)).
Alix Eisenhardt


1

Excel, 14 byte

=ROUNDUP(A1,1)

Chào mừng đến với trang web! Đây là một câu trả lời đầu tiên rất hay, bạn có bất kỳ liên kết nào đến một nơi nào đó có thể được kiểm tra, tốt nhất là trực tuyến, để những người dùng khác không phải tải xuống Excel không?
caird coinheringaahing

Thật không may, tôi không nghĩ rằng có bất kỳ trang web Microsoft miễn phí nào do cấp phép, xin lỗi. Tôi đã thấy các câu trả lời Excel khác trên Code Golf nhưng tôi không chắc những câu trả lời đó được xác thực như thế nào vì tôi mới!
REW

Điều đó không làm việc cho hầu hết các trường hợp thử nghiệm. Đó là làm tròn đến vị trí "một phần mười". Nó cần làm tròn (không lên) cho dù vị trí quan trọng nhất là gì.
Thực phẩm điện tử cầm tay



0

Forth (gforth) , 24 byte

: f 1 set-precision f. ;

Hãy thử trực tuyến!

Đầu vào dự kiến ​​trên ngăn xếp điểm nổi. Đầu ra là thiết bị xuất chuẩn

Tôi không muốn thay đổi độ chính xác toàn cầu (ví dụ này) của các hàm đầu ra dấu phẩy động, nhưng nó tiết kiệm rất nhiều byte để không phải khôi phục giá trị trước đó ở cuối. Không đầu ra trong kỹ thuật hoặc ký hiệu khoa học, bất kể đầu vào.

Lưu ý: Vì một số lý do, trình thông dịch tio chuyển đổi 0.25thành 0.2, trong khi cài đặt cục bộ của tôi chuyển đổi 0.25thành 0.3. Tôi không hoàn toàn chắc chắn tại sao lại như vậy, nhưng vì tôi nhận được kết quả chính xác tại địa phương, tôi để lại câu trả lời của mình như là

: 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.