JavaScript: Birkaç ondalık basamağa yuvarlayın, ancak fazladan sıfırları kaldırın


85

İşte senaryo: Ne .9999999999999999zaman almam gerektiğini anlıyorum 1.0.
Ondalık kesinlik basamağını kaybetmeyi göze alabilirim, bu yüzden .toFixed(15)ne tür işler kullanıyorum.

Yuvarlama işe yarıyor, ancak sorun bana verilmiş olması 1.000000000000000.
Birkaç ondalık basamağa yuvarlamanın, ancak fazladan boşluk bırakmanın bir yolu var mı?

Not: .toPrecisionistediğim şey değil; Sadece ondalık noktadan sonra kaç sayı olduğunu belirtmek istiyorum.
Not 2: .toPrecision(1)Ondalık noktadan sonra gerçekten veri içeren sayılar için yüksek kesinliği korumam gerektiği için kullanamam . İdeal olarak, tam olarak gerektiği kadar ondalık hane olacaktır (15'e kadar).


Nokta, .toFixed'in bir Dize döndürmesidir, bu nedenle onu bir Sayı aracılığıyla döndürmek ve ardından bir String'e geri döndürmek, onu takip eden sıfırlar olmadan yeniden döndürür.
Neil

@Nathan: sadece açıklama için. Sadece toFixed () ile elde ettiğiniz dizedeki sondaki sıfırları kaldırmak mı istiyorsunuz ?
Jiri Kriz

Yanıtlar:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
: Negatif sayıların tedavi sırasında parantez içine koymak unutmayın -2.34.toFixed(1)döner -2.3dolayı operatör öncelik .
Константин Ван

1
Tekli + operatörünün kullanılması parseFloatişlevden daha hızlı olmalıdır : +number.toFixed(13)Bu ifade, 1.0000000000000045 gibi JavaScript sayı yanlışlıklarını kaldırmak için de kullanılabilir.
ygoe


19

Anladığım kadarıyla, aracılığıyla elde ettiğiniz dizedeki sondaki sıfırları kaldırmak istiyorsunuz toFixed(). Bu saf bir dizge işlemidir:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
Soruyu gerçekten cevaplayan tek kişi sensin .. teşekkürler!
Mugen

4
Bu noktayı yuvarlak sayılarda bırakır ("100.00" => "100.")
pckill

5
@pckill Eğer noktanın yerini almasını istemiyorsanız, onu normal ifadeye dahil edebilirsiniz ( ...replace(/\.?0+$/, "");).
Zach Snow

Yani on 0 başarısız olur ve -0 çünkü 0boş bir dize olur ""ve -0olur -(bir tahmin de) beklenir ikisi de. @ zach-snow önerdiğiniz çözüm de 0 ve -0'da başarısız oluyor.
robocat

@Mugen, Gus'ın cevabındaki sorun neydi?
trysis

10

Number(n.toFixed(15)) or +(n.toFixed(15)) 15 basamaklı ondalık dizeyi bir sayıya dönüştürerek sondaki sıfırları kaldırır.


1
+ (N.toFixed (...)), parseFloat'tan çok daha etkilidir. Neden olduğundan emin değilim, ama aynı zamanda Chrome'daki Number'dan daha verimli.
Domino

8

Dönüş değerini bir sayıya çevirirseniz, sondaki sıfırlar atılır. Bu aynı zamanda olduğundan daha az ayrıntılıdır parseFloat().

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

Bu kullanır tekli + operatörü bu öncesinde bir infix + olması gerekir böylece bir dize operasyonu kapsamında bu kullanılıyorsa,: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));. Bilginize Bir dizenin önündeki tekli + onu bir Sayıya dönüştürür. MDN'den: Unary + şunları yapabilir:

tamsayıların ve kayan sayıların dize temsillerini ve dize olmayan değerleri true, false ve null dönüştürün. Hem ondalık hem de onaltılık ("0x" -önekli) biçimlerdeki tamsayılar desteklenir. Negatif sayılar desteklenir (onaltılık için olmasa da). Belirli bir değeri ayrıştıramazsa, NaN olarak değerlendirilir.


@robocat Az önce basit bir kontrol yaptım; +(4.1).toFixed(4)olduğu 4.1içinde Chrome 60 .
Константин Ван

Ben anlamadım Bu cevabın olumsuz oylanmasının nedeni neydi?
Константин Ван

@K Haklıydın, bu yüzden önceki yorumumu sildim ve yanıta ekledim (sanırım tekli + kullanmak yerine lhs üzerinde bir dizeyle infix + kullanıyordum. Genellikle daha dikkatliyim! Şerefe)
robocat

Bu cevap hala NaN, Infinity, -Infinity, 3e30 ve 0 ile çalışmaktadır. Diğer bazı cevaplar, bazı köşe durumlarda başarısız olur.
robocat

(4) .toFixed (2) -> "4.00" Chrome'da 60.0.3112.113
Daniel Que

1

Bunların hiçbiri, soru başlığına göre aradığımı gerçekten vermedi, örneğin 5.00 için 5 ve 5.10, 5.1 olacaktı. Benim çözümüm şuydu:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

Not: Normal ifade yalnızca places > 0

PS https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


Başarısız 5e30(numarayı olarak değiştirir 5e3). Köşe vakaları şeytani!
robocat

0

Hassasiyeti koruyan ve ayrıca sıfırları çıkaran daha iyi bir yöntem var. Bu, bir giriş numarası alır ve bir miktar atma sihri sayesinde, sondaki sıfırları çeker. 16'yı benim için hassasiyet sınırı olarak buldum, bu da eğer plütona bir uydu koymamanız durumunda oldukça iyi.

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

toFixed()Yöntem, bir biçimleri numberkullanılarak sabit nokta gösterimi ve bir döner string.

Yarım yukarı yuvarlama stratejisi uygular .

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

Sizin de tarif ettiğiniz gibi, bazen de (potansiyel olarak gereksiz) sonunda sıfırlara neden olacaktır.

(0.001).toFixed(2); // returns 0.00

Sondaki sıfırlardan kurtulmak istemeyebilirsiniz, esasen onu tekrar a'ya dönüştürebilirsiniz number. Bunu yapmanın birçok yolu var.

+(0.001).toFixed(2); // the shortest

Dizeleri sayılara dönüştürmenin farklı yöntemlerine genel bir bakış için, lütfen bazı mükemmel yanıtları olan bu soruyu kontrol edin .

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.