Các toán tử toán học *, /, +, -, ^ có thể được sử dụng để chuyển một số khác 0 thành 1 không?


118

Tôi đang làm việc với các phần mềm (Oracle Siebel) mà chỉ hỗ trợ biểu thức JavaScript với những hoạt động nhân, chia, trừ, thêm, và XOR ( *, /, -, +, ^). Tôi không có các nhà khai thác khác như !hoặc ? :có sẵn.

Sử dụng các toán tử trên, có thể chuyển một số thành 1 nếu nó khác 0 và để 0 nếu nó đã 0 không? Số có thể là số dương, số không hoặc số âm.

Thí dụ:

var c = 55;

var d;  // d needs to set as 1

Tôi đã thử c / c, nhưng nó đánh giá NaNkhi nào clà 0. dcần phải là 0 khi clà 0.

c là một giá trị tiền tệ và nó sẽ có tối đa hai chữ số ở cuối và 12 chữ số đứng đầu.

Tôi đang cố gắng mô phỏng một ifđiều kiện bằng cách chuyển đổi một số thành Boolean 0 hoặc 1, rồi nhân các phần khác của biểu thức.


3
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Samuel Liew

10
@SamuelLiew Mặc dù có rất nhiều bình luận và một số bình luận trong số đó nên được xóa ( thảo luận , trả lời trong bình luận ), hầu hết chúng thực sự được yêu cầu làm rõ ( ví dụ ). Các bình luận hỏi liệu đó có phải là vấn đề XY không .
user202729

Oracle Siebel Numeric Operator, có vẻ là Exponent: docs.oracle.com/cd/E95904_01/books/VBLANG/…
Derrick Moeller

2
@DerrickMoeller Có vẻ như có sự khác biệt giữa Siebel VB và Siebel eScript. Trong phần sau, nó là một chút xor . Tôi không chắc cái nào trong hai cái áp dụng ở đây.
CRice

3
@ user202729 sau khi toàn bộ chuỗi nhận xét quá dài, chúng tôi sẽ không xử lý từng nhận xét theo cách khác nhau, vì giao diện mod được tạo bởi quản trị viên / nhà phát triển SE thích hành động mặc định của chúng tôi là "chuyển sang trò chuyện" hoặc "xóa tất cả". Nếu bất kỳ nhận xét nào hữu ích, nó nên được chỉnh sửa thành câu hỏi hoặc đăng dưới dạng câu trả lời. Nếu bất kỳ bình luận nào lạc đề, chúng nên được tự cắt / xóa. Nếu bạn muốn thảo luận về "tính năng" của mod này và / hoặc "quá nhiều nhận xét" mà người kiểm duyệt cờ tự động nhận được, vui lòng đưa nó lên thảo luận trên Meta hoặc Meta.SE. Cảm ơn bạn.
Samuel Liew

Câu trả lời:


149

c / (c + 5e-324)nên làm việc. (Hằng số 5e-324Number.MIN_VALUE, số dương nhỏ nhất có thể biểu diễn.) Nếu x là 0, tức là chính xác 0 và nếu x khác 0 (về mặt kỹ thuật, nếu x ít nhất là 4.45014771701440252e-308, là số khác 0 nhỏ nhất được phép trong câu hỏi, 0,01, là), phép toán dấu phẩy động của JavaScript quá không chính xác để câu trả lời khác 1, vì vậy nó sẽ chính xác là 1.


1
bạn cần phải chuyển đổi biểu thức để bool đầu tiên, kể từ khi OP đang cố gắng nhân 0 và 1 với other parts of the expression, và c / (c + 5e-324) * some_expressionsẽ không làm việc
phuclv

28
Thực hiện một lỗi và biến nó thành một tính năng có
Chirag Bhatia - chirag64

1
@Medinoc có, nhưng câu hỏi cũng nói rằng sẽ không bao giờ có nhiều hơn 2 chữ số sau dấu thập phân, và 324 là nhiều hơn 2.
Joseph sible-Khôi phục Monica

1
Nó thú vị và nó có thể hiệu quả với OP, nhưng tôi thực sự ghét phải xem loại mã này khi làm việc trong nhóm. Ít nhất, nó phải được ghi chép đầy đủ và thử nghiệm.
Eric Duminil

1
@JosephSible Tôi biết, nhưng nếu bạn thực sự hiểu theo cách đó, câu trả lời rõ ràng nhất phải là Number(Boolean(n)), không sử dụng toán tử. Tôi không nói đây không phải là câu trả lời mà OP đang tìm kiếm, nhưng đây không phải là câu trả lời cho câu hỏi mà OP đã mô tả. Có lẽ nên cải thiện câu hỏi.
dùng5532169

216

Sử dụng biểu thức n/n^0.

Nếu nkhông phải là 0:

 Step    Explanation
------- -------------------------------------------------------------------------------
 n/n^0   Original expression.
 1^0     Any number divided by itself equals 1. Therefore n/n becomes 1.
 1       1 xor 0 equals 1.

Nếu nlà 0:

 Step    Explanation
------- -------------------------------------------------------------------------------
 n/n^0   Original expression.
 0/0^0   Since n is 0, n/n is 0/0.
 NaN^0   Zero divided by zero is mathematically undefined. Therefore 0/0 becomes NaN.
 0^0     In JavaScript, before any bitwise operation occurs, both operands are normalized.
         This means NaN becomes 0.
 0       0 xor 0 equals 0.

Như bạn có thể thấy, tất cả các giá trị khác 0 đều được chuyển đổi thành 1 và 0 vẫn ở mức 0. Điều này thúc đẩy thực tế là trong JavaScript, NaN^0là 0.

Bản giới thiệu:

[0, 1, 19575, -1].forEach(n => console.log(`${n} becomes ${n/n^0}.`))


45
TIL: Number.NaN ^ n === no_O (ở đâu nlà một số hữu hạn)
zerkms

17
Có vẻ như khi được sử dụng như một toán hạng bit, NaNđược chuyển đổi thành 0 một cách thuận tiện. Xem: Hoạt động
bitwise

3
@zerkms Có lẽ ~~NaN === 0có vẻ tự nhiên hơn
Bergi 25/10/18

8
@EnricoBorba Nó không phải là lũy thừa (sử dụng **), nó là một XOR bit. Các phép toán bitwise có mức độ ưu tiên rất thấp trong javascript nên việc phân chia sẽ xảy ra trước.
CRice

3
^là toán tử xor bit. Tôi nghi ngờ nếu ^trong OP là bitwise xor khi tất cả các toán tử khác là toán tử số học. Nó có thể là toán tử lũy thừa ( **trong JavaScript).
Salman A

17

(((c/c)^c) - c) * (((c/c)^c) - c) sẽ luôn trả về 1 cho phủ định và dương tính và 0 cho 0.

Nó chắc chắn khó hiểu hơn câu trả lời đã chọn và dài hơn. Tuy nhiên, tôi cảm thấy nó ít hack hơn và không dựa vào các hằng số.

CHỈNH SỬA: Như @JosephSible đã đề cập, phiên bản nhỏ gọn hơn của tôi và phiên bản của @ CRice không sử dụng hằng số là:

c/c^c-c

Câu trả lời của CRice đã không được chọn, Joseph Sible. Thành thật mà nói, tôi đã không nhận thấy câu trả lời của CRice cho đến sau khi đăng.
Kyle Wardle

2
Tuy nhiên, nó không sử dụng hằng số, chỉ sử dụng các toán tử và biến đã cho.
L3viathan

2
@JosephSible c/c^(c-c)chỉ làc
Tavian Barnes

2
@JosephSible Tôi đang đọc ^là lũy thừa như ngụ ý của OP "nhân, chia, trừ, cộng và số mũ (*, /, -, +, ^ )". Nếu ^là XOR với quyền ưu tiên JavaScript của nó thì tôi nhầm. Tôi đã yêu cầu làm rõ trên OP.
Tavian Barnes

2
@TavianBarnes đó không phải là những gì OP đã viết; ai đó đã chỉnh sửa câu hỏi. Tôi đã khôi phục nó theo cách OP thực sự yêu cầu.
Joseph Sible-Reinstate Monica

2

Một câu trả lời rất phức tạp, nhưng không phụ thuộc vào độ chính xác giới hạn: Nếu bạn lấy x^(2**n), giá trị này sẽ luôn bằng x+2**nnếu x bằng 0, nhưng sẽ bằng x-2**nnếu x có một ở vị trí thứ n. Do đó, đối với x = 0, (x^(2**n)-x+2**n)/(2**(n+1)sẽ luôn là 1, nhưng đôi khi nó sẽ là 0 đối với x! = 0. Vì vậy, nếu bạn lấy tích (x^(2**n)-x+2**n)/(2**(n+1)trên tất cả n, sau đó XOR rằng với 1, bạn sẽ nhận được hàm mong muốn của mình. Tuy nhiên, bạn sẽ phải viết mã từng yếu tố theo cách thủ công. Và bạn sẽ phải sửa đổi điều này nếu bạn đang sử dụng dấu chấm động.

Nếu bạn có ==nhà điều hành, thì sẽ (x==0)^1hoạt động.


3
Không có **cũng không ==có.
Joseph Sible-Reinstate Monica
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.