Saya bekerja dengan perangkat lunak (Oracle Siebel) yang hanya mendukung ekspresi JavaScript dengan operator multiply, membagi, mengurangi, menambah, dan XOR ( *
, /
, -
, +
, ^
). Saya tidak memiliki operator lain seperti !
atau ? :
tersedia.
Dengan menggunakan operator di atas, apakah mungkin untuk mengonversi angka menjadi 1 jika bukan nol dan membiarkannya 0 jika sudah nol? Angka tersebut bisa positif, nol, atau negatif.
Contoh:
var c = 55;
var d; // d needs to set as 1
Saya mencoba c / c
, tetapi mengevaluasi NaN
kapan c
0. d
perlu 0 saat c
0.
c adalah nilai mata uang, dan akan memiliki maksimal dua digit terakhir dan 12 digit awal.
Saya mencoba meniru if
kondisi dengan mengubah angka menjadi Boolean 0 atau 1, lalu mengalikan bagian lain dari ekspresi.
javascript
siebel
dave
sumber
sumber
Jawaban:
c / (c + 5e-324)
harus bekerja. (Konstanta5e-324
adalahNumber.MIN_VALUE
, bilangan positif terkecil yang dapat direpresentasikan.) Jika x adalah 0, itu persis 0, dan jika x bukan nol (secara teknis, jika x setidaknya 4.45014771701440252e-308, yang merupakan bilangan bukan nol terkecil yang diizinkan di pertanyaan, 0,01, adalah), matematika floating-point JavaScript terlalu tidak tepat untuk jawabannya menjadi berbeda dari 1, jadi akan keluar persis 1.sumber
other parts of the expression
, danc / (c + 5e-324) * some_expression
tidak akan berhasilNumber(Boolean(n))
, yang tidak menggunakan operator. Saya tidak mengatakan ini bukan jawaban yang dicari OP, tapi ini bukan jawaban atas pertanyaan yang dijelaskan OP. Mungkin harus memperbaiki pertanyaan itu.Gunakan ekspresi tersebut
n/n^0
.Jika
n
bukan nol:Jika
n
nol:Seperti yang Anda lihat, semua nilai bukan nol diubah menjadi 1, dan 0 tetap berada di 0. Ini memanfaatkan fakta bahwa dalam JavaScript,
NaN^0
adalah 0.Demo:
sumber
Number.NaN ^ n === n
o_O (di manan
adalah bilangan terbatas)NaN
mudah diubah menjadi nol. Lihat: Operasi bitwise pada bukan angka~~NaN === 0
tampak lebih alami**
), ini XOR bitwise. Operasi bitwise memiliki prioritas yang sangat rendah di javascript sehingga pembagian akan terjadi terlebih dahulu.^
adalah operator bitwise xor. Saya ragu jika^
di OP adalah xor bitwise bila semua operator lain adalah operator aritmatika. Ini mungkin operator eksponen (**
dalam JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
akan selalu mengembalikan 1 untuk negatif dan positif dan 0 untuk 0.Ini pasti lebih membingungkan daripada jawaban yang dipilih dan lebih lama. Namun, saya merasa ini kurang hacky dan tidak mengandalkan konstanta.
EDIT: Seperti yang disebutkan @JosephSible, versi saya yang lebih ringkas dan versi @ CRice yang tidak menggunakan konstanta adalah:
sumber
c/c^(c-c)
hanyac
^
sebagai eksponen seperti yang tersirat oleh OP "mengalikan, membagi, mengurangi, menambah, dan eksponen (*, /, -, +, ^ )". Jika^
XOR dengan JavaScript diutamakan maka saya salah. Saya meminta klarifikasi tentang OP.Jawaban yang sangat rumit, tetapi tidak bergantung pada presisi terbatas: Jika Anda mengambilnya
x^(2**n)
, ini akan selalu sama denganx+2**n
jika x adalah nol, tetapi akan sama denganx-2**n
jika x memiliki satu di tempat ke-n. Jadi, untuk x = 0,(x^(2**n)-x+2**n)/(2**(n+1)
akan selalu 1, tetapi terkadang nol untuk x! = 0. Jadi jika Anda mengambil hasil perkalian dari(x^(2**n)-x+2**n)/(2**(n+1)
semua n, maka XOR dengan 1, Anda akan mendapatkan fungsi yang Anda inginkan. Anda harus mengkodekan setiap faktor secara manual. Dan Anda harus memodifikasi ini jika Anda menggunakan floating point.Jika Anda memiliki
==
operator, maka(x==0)^1
berfungsi.sumber
**
juga==
tidak tersedia.