LINUX.ORG.RU

[JavaScript][Мазила] 1.2 * 3 = ?


2

1

Отлаживал один проект, случайно наткнулся на баг(?).

<!DOCTYPE html>
<html>
	<head>
		<title>WTF?!</title>
	</head>
	
	<body>
		<script type="text/javascript">
			<!--
			alert(1.2*3);
			//-->
		</script>
	</body>
</html>

Готовая страница: http://ompldr.org/vYXM4NQ
Результат: http://ompldr.org/vYXM3eg

Как такое вообще возможно?
P.S. Проявляется в FF 3.6.23, в других браузерах того же семейства ещё не проверял.

Pentium DIV bug возвращается)

А вообще, это что-то с типами связано. По дефолту там что, float?

devl547 ★★★★★ ()
Ответ на: комментарий от wintrolls

В Опере, внезапно, всё работает правильно.

Сначала найди место в стандарте, где говорится как флоаты должны преобразовываться в строку, только потом уже говори, что правильно, а что не правильно.

baverman ★★★ ()
Ответ на: комментарий от wintrolls

Вам же написали:

Запиши в двоичной системе 1.2*3. О результатах доложись.

strangeman ★★★★ ()
Ответ на: комментарий от x3al

А давай ты сравнишь скорость оперы с её «прямым» «стандартом» и скорость жирнолиса?
А ещё половой орган с пальцем сравнить можно.

wintrolls ☆☆ ()
Ответ на: комментарий от baverman

Я намекаю на то, что люди либо встречались с этой проблемой и решали её, либо даже не подозревают о её существовании. Поскольку она проявляется только на определённых наборах чисел — думаю что вторых больше.

wintrolls ☆☆ ()
Ответ на: комментарий от baverman

По-твоему, с какой точностью мне надо вывести результат умножения числа с одной цифрой после запятой на целое число?

wintrolls ☆☆ ()
Ответ на: комментарий от wintrolls

Такой проблемы не существует и никак она не проявляется. А вот проблем с неграмотными винтроллями множество.

madcore ★★★★★ ()
Ответ на: комментарий от wintrolls

Попробуй ещё alert(0.1+0.2) :) А почему опера округляет - хз, вероятно баг, ни хром, ни ие, ни старая опера этого не делают.

JustGuest ()
Ответ на: комментарий от GateKeeper

Оно считает, что 0 в начале — признак восьмеричного числа, но числа 8 в восьмеричной системе не существует, поэтому возвращается 0.

wintrolls ☆☆ ()
Ответ на: комментарий от wintrolls

Всё правильно. При невозможности преобразования в int текущего символа в строке по заданному radix, чтение строки останавливается и возвращается результат преобразования предыдущих. parseInt('018', 8) будет 1, '08' при 8 (default, deprecated) - 0. Бага нет.

GateKeeper ★★ ()
Ответ на: комментарий от GateKeeper

чтение строки останавливается и возвращается результат преобразования предыдущих

Когда, по-хорошему, должно броситься исключение. Js, вообще, какая-то пародия на язык программирования.

baverman ★★★ ()
Ответ на: комментарий от devl547

Жабаскрипт он такой. Целые числа для него это что-то невообразимо далёкое.

Deleted ()
Ответ на: комментарий от baverman

Есть подозрение, что исключение не бросает в силу реализации на регекспах. Можно и в питоне int() переписать, чтоб не бросало исключения, с использованием re.

GateKeeper ★★ ()
Ответ на: комментарий от GateKeeper

Меня, как программиста не должны волновать кишки. Важно, чтоб я мог узнать валидные данные пришли на вход и вернуть значение или какая-то хирота. Почему-то в куче остальных языков с этим всё нормально. А js и php — пара кривых братьев на век.

baverman ★★★ ()

Еще один не знает о реализации чисел с плавающей запятой в современных компьютерах.

Yasenfire ()

Opera - 3.5999999999999996
Opera Next - 3.6

IE 9 - 3.5999999999999996

bhfq ★★★★★ ()
Ответ на: комментарий от wintrolls

числа с одной цифрой после запятой

Какого типа переменная? С каким основанием выводится? Между прочим, от этого зависит.

Xenesz ★★★★ ()
Ответ на: комментарий от PolarFox

>Этот баг есть в куче языков от C до Python.

В нормальных реализациях ещё с середины прошлого века стараются считать с точностью на 1-2 знака больше, чем выводить :)

Именно из-за ошибок преобразований и округлений.

KRoN73 ★★★★★ ()
Ответ на: комментарий от baverman

>В чем кривота? В том что лиса выводит неформатированный флоат?

Угу. Даже в древних Бейсиках 1960-х гг. такое считалось злом.

KRoN73 ★★★★★ ()
Ответ на: комментарий от baverman

>Обычно, людям надо вывести число с какой-то точностью. Поэтому для них это не проблема.

Обычно людям нужно вывести значимые цифры числа.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Но для этого нужно сначала определить точность обоих множителей, добавить «про запас» пару знаков, перемножить, затем округлить до желаемой точности.

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.