Sıfır olmayan bir sayıyı 1'e dönüştürmek için matematiksel operatörler *, /, +, -, ^ kullanılabilir mi?


118

Sadece eklemek çıkarma, çarpma operatörleri ile JavaScript ifadeleri destekler bölme yazılımı (Oracle Siebel) ile çalışan ve am XOR ( *, /, -, +, ^). Gibi !veya ? :müsait başka operatörlerim yok .

Yukarıdaki operatörleri kullanarak, bir sayıyı sıfır değilse 1'e dönüştürmek ve zaten sıfırsa 0 olarak bırakmak mümkün müdür? Sayı pozitif, sıfır veya negatif olabilir.

Misal:

var c = 55;

var d;  // d needs to set as 1

Denedim c / c, ancak 0 NaNolduğunda değerlendiriyor c, 0 olduğunda 0 olması dgerekiyor c.

c bir para birimi değeridir ve en fazla iki sondaki basamağa ve 12 basamağa sahip olacaktır.

ifBir sayıyı Boolean 0 veya 1'e dönüştürerek ve ardından ifadenin diğer kısımlarını çarparak bir koşulu taklit etmeye çalışıyorum .


3
Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Samuel Liew

10
@SamuelLiew Çok sayıda yorum olmasına ve bazılarının kaldırılması gerekmesine rağmen ( tartışma , yorumda cevap ), çoğu gerçekten açıklama talebidir ( örneğin ). Bunun bir XY sorunu olup olmadığını soran yorumlar sınırda.
user202729

Oracle Siebel Numeric Operators, Exponent gibi görünüyor: docs.oracle.com/cd/E95904_01/books/VBLANG/…
Derrick Moeller

2
@DerrickMoeller Siebel VB ve Siebel eScript arasında bir fark var gibi görünüyor. İkincisinde, bitsel bir xor . Burada ikisinden hangisinin geçerli olduğundan emin değilim.
CRice

3
@ user202729 herhangi bir yorum dizisi çok uzun sürdüğünde, yorumları tek tek farklı şekilde ele almayacağız, çünkü SE yöneticileri / devs tarafından oluşturulan mod arayüzü "sohbete git" veya "tümünü sil" olarak varsayılan eylemlerimizi tercih ediyor. Herhangi bir yorum yararlıysa, sorunun kendisi düzenlenmeli veya yanıt olarak gönderilmelidir. Herhangi bir yorum konu dışı ise, kendiliğinden budanmış / silinmiş olmalıdır. Moderatörlerin aldığı bu "özellik" ve / veya "çok fazla yorum" modunu tartışmak istiyorsanız, lütfen bunu Meta veya Meta.SE'de tartışmak için gündeme getirin. Teşekkür ederim.
Samuel Liew

Yanıtlar:


149

c / (c + 5e-324)çalışmalı. (Sabit 5e-324, Number.MIN_VALUEtemsil edilebilen en küçük pozitif sayıdır.) Eğer x 0 ise, bu tam olarak 0 ve x sıfır değilse (teknik olarak, eğer x en az 4.45014771701440252e-308 ise, burada izin verilen en küçük sıfır olmayan sayıdır. soru, 0.01, is), JavaScript'in kayan noktalı matematiği, cevabın 1'den farklı olması için fazla belirsizdir, bu nedenle tam olarak 1 olarak çıkacaktır.


1
OP 0 ve 1'i ile çarpmaya çalıştığı other parts of the expressionve c / (c + 5e-324) * some_expressionçalışmayacağı için önce
ifadeyi bool'a dönüştürmeniz gerekir

28
Bir hata aldı ve orada bir özelliğe dönüştürdü
Chirag Bhatia - chirag64

1
@Medinoc evet, ancak soru ayrıca ondalık noktadan sonra hiçbir zaman 2 basamaktan fazla olmayacağını ve 324'ün 2'den çok daha fazla olduğunu söylüyor.
Joseph Sible-Reinstate Monica

1
İlginç ve OP için işe yarayabilir, ancak bir takımda çalışırken bu tür bir kodla karşılaşmaktan gerçekten nefret ederim. En azından, iyi bir şekilde belgelendirilmeli ve test edilmelidir.
Eric Duminil

1
@JosephSible Biliyorum, ama gerçekten böyle düşünürseniz, en bariz cevap Number(Boolean(n))operatör kullanmayan olmalıdır . OP'nin aradığı cevabın bu olmadığını söylemedim, ancak OP'nin tarif ettiği sorunun cevabı bu değil. Muhtemelen soruyu iyileştirmeli.
user5532169

216

İfadeyi kullanın n/n^0 .

Eğer nsıfır değildir:

 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.

Eğer nsıfırdır:

 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.

Gördüğünüz gibi, sıfır olmayan tüm değerler 1'e dönüştürülür ve 0, 0'da kalır. Bu, JavaScript'te, NaN^0 0 .

Demo:

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


45
TIL: Number.NaN ^ n === no_O (burada nsonlu bir sayıdır)
zerkms

17
Bitsel işlenen olarak kullanıldığında NaN, uygun şekilde sıfıra dönüştürüldüğü görülmektedir. Bakınız:
Sayı

3
@zerkms Belki ~~NaN === 0daha doğal görünüyor
Bergi

8
@EnricoBorba Üsselleştirme değil (kullanan **), bitsel bir XOR. Bitsel işlemlerin javascript'te çok düşük bir önceliği vardır, bu nedenle bölünme ilk önce gerçekleşir.
CRice

3
^bitsel xor operatörüdür. ^OP'nin bitsel xveya diğer tüm operatörler aritmetik operatörler olduğunda olduğundan şüpheliyim . Muhtemelen üs alma operatörüdür ( **JavaScript'te).
Salman A

17

(((c/c)^c) - c) * (((c/c)^c) - c) negatifler ve pozitifler için her zaman 1 ve 0 için 0 döndürür.

Kesinlikle seçilen cevaptan daha kafa karıştırıcı ve daha uzundur. Bununla birlikte, daha az hack olduğunu ve sabitlere bağlı olmadığını hissediyorum.

DÜZENLEME: @JosephSible'ın bahsettiği gibi, benim ve @ CRice'in sabitleri kullanmayan daha kompakt bir versiyonu:

c/c^c-c

CRice'nin cevabı seçilmedi, Joseph Sible seçildi. Dürüst olmak gerekirse, CRice'nin cevabını gönderi sonrasına kadar fark etmedim.
Kyle Wardle

2
Ancak hiçbir sabit kullanmaz, sadece operatörler ve verilen değişkeni kullanır.
L3viathan

2
@JosephSible c/c^(c-c)is justc
Tavian Barnes

2
@JosephSible ^OP "çarpma, bölme, çıkarma, toplama ve üs (*, /, -, +, ^ )" ifadesinin ima ettiği gibi üs alma olarak okuyordum . Eğer ^onun JavaScript önceliğiyle XOR olduğunu o zaman yanılıyorumdur. OP hakkında açıklama istedim.
Tavian Barnes

2
@TavianBarnes bu OP'nin yazdığı şey değil; birisi soruyu düzenledi. OP'nin istediği şekilde geri yükledim.
Joseph Sible-Reinstate Monica

2

Çok karmaşık bir cevap, ancak sınırlı bir kesinliğe bağlı olmayan bir cevap: Eğer alırsanız x^(2**n), bu her zaman x+2**nx sıfırsa eşit olacaktır, ancak x-2**nx'in n'inci sırada bir bulunmasına eşit olacaktır . Böylece, x = 0 için (x^(2**n)-x+2**n)/(2**(n+1)her zaman 1 olacaktır, ancak bazen x! = 0 için sıfır olacaktır. Yani (x^(2**n)-x+2**n)/(2**(n+1), tüm n'nin çarpımını alırsanız, 1 ile XOR, istediğiniz işlevi elde edersiniz. Yine de her faktörü manuel olarak kodlamanız gerekecek. Ve kayan noktalar kullanıyorsanız bunu değiştirmeniz gerekecek.

Eğer varsa ==operatörü, o zaman (x==0)^1çalışır.


3
Ne mevcut **ne ==de mevcut.
Joseph Sible-Reinstate Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.