2013-09-11 3 views
12

Мне нужно сравнить следующие сценарии с использованием десятичного сравнения в jquery.Ошибка сравнения десятичных чисел в JavaScript

var a=99999999999.99; 
var b=9999999999999999999 

if(parseFloat(a).toFixed(2) > parseFloat(b).toFixed(2)) 

Это всегда возвращает true. Как исправить проблему?

Некоторые из выходов из того, что я пробовал:

parseFloat(9874563212).toFixed(2) > parseFloat(98745632).toFixed(2) true 
parseFloat(98745632).toFixed(2) > parseFloat(987456321).toFixed(2) false 
parseFloat(99999999999.99).toFixed(2) > parseFloat(9999999999999999999).toFixed(2) true 
parseFloat(99999999999.99).toFixed(2) > parseFloat(999999999999).toFixed(2) false 
parseFloat(99999999999.99).toFixed(2) > parseFloat(9999999999999).toFixed(2) false 
parseFloat(99999999999.99).toFixed(2) > parseFloat(99999999999999).toFixed(2) false 
parseFloat(99999999999.99).toFixed(2) > parseFloat(999999999999999).toFixed(2) false 
parseFloat(99999999999.99).toFixed(2) > parseFloat(9999999999999999).toFixed(2) true 
parseFloat(99999999999.99).toFixed(2) > parseFloat(1111111111111111).toFixed(2) true 
parseFloat(99999999999.99).toFixed(2) > parseFloat(111111111111111).toFixed(2) true 
+1

Не 'toFixed()' вернуть строку? –

+0

Вам не нужен 'parseFloat'. 'toFixed' является свойством объекта' Number', поэтому оба целых числа и числа с плавающей запятой имеют его – dtech

ответ

31

Вы сравниваете строки, а не числа (.toFixed() возвращает строку). Попробуйте:

if (parseFloat(parseFloat(a).toFixed(2)) > parseFloat(parseFloat(b).toFixed(2))) 

Или, если a и b уже цифры, как в вашем примере

if (parseFloat(a.toFixed(2)) > parseFloat(b.toFixed(2))) 

Или лучше

if (Math.round(a * 100) > Math.round(b * 100)) 
+1

Или 'Math.round (a * 100)/100', если вы хотите, чтобы исходный поплавок вернулся (не обязательно, если вы только хотите сравните) – dtech

+0

@dtech Я убедил его, потому что это было теоретически влиятельным, потому что он только их сравнивал. – xanatos

+0

спасибо, помогли мне много! :) – loki9

Смежные вопросы