2016-08-26 6 views
-3

В головоломке я получил следующий фрагмент кода вчера с вопросомЕсть ли ошибка с плавающей запятой в этом запутанном коде?

Почему это дает 773.06 ..?

var _ = 10, __ = 21, ___ = 38; 
 
var _______ = { _: { "yo":_/___*_+___ }}; 
 
var ___________ = [[[{"heh":{"hehe":[[[[12,71,82,91]]]][0][0][0][1]}}]]]; 
 
var ____________ = ___________[0][0][0].heh.hehe*_+__+_______._.yo/_+___; 
 
console.log(____________);

Я не могу вспомнить ожидаемый ответ, но это было по крайней мере 800. коллега посмотрел на него коротко и сказал, что это было связано с плавающей точкой неточностей, но я думаю, что оно должно возвращение 773.06 ..

Каков правильный ответ?

прибрано код

var a = 10, b = 21, c = 38; 
 
var d = a/c*a+c; 
 
var e = (71*a)+b+(d/a)+c; 
 
console.log(e);

+2

бы помочь людям в значительной степени, если вы изменили все имена переменных из '_' в' а, Ь, c' или подобные для удобства чтения –

+1

Является ли этот код гольф? – Liam

+1

Кажется, что дети играли на клавиатуре –

ответ

3

давайте просто удалить раздуваться, и дать эту вещь несколько читаемых имен переменных:

//translated line by line 
var a = 10, b = 21, c = 38; 
var d = a/c*a + c; 
//d = 100/38 + 38 
//d = 40.63157894736842 
var e = [12,71,82,91][1]; 
//e = 71; 
var f = e*a + b + d/a + c; 
//f = 710 + 21 + 4.xxx + 38 
//f = 773.0631578947368 
console.log(f); 
+0

Просто чтобы подтвердить это https://jsfiddle.net/nn9p92u0/ – Liam

2

Последняя строка эквивалентна: 71*10+21+(10/38*10+38)/10+38, который 773.06 ...

Вы можете получить 809.63157894, если вы забыли разделить d на a

2

На самом деле нет никакой ошибки. Это намеренно запутан, но если вы облегчите вы получите следующее:

var A = 10; 
var B = 21; 
var C = 38; 
var D = { A: { "yo": A/C * A + C }}; 
var E = [[[{"heh":{"hehe":[[[[12, 71, 82, 91]]]][0][0][0][1]}}]]]; 
var F = E[0][0][0].heh.hehe * A + B + D.A.yo/A + C; 
console.log(F); 

Который тогда становится:

var D = 10/38 * 10 + 38; 
var E = [[[[12, 71, 82, 91]]]][0][0][0][1]; 
var F = E * 10 + 21 + D/10 + 38; 
console.log(F); 

Который тогда становится:

var D = 10/38 * 10 + 38; 
var F = 71 * 10 + 21 + D/10 + 38; 
console.log(F); 

Который тогда становится:

var F = 769 + (100/38 + 38)/10; 
console.log(F); 

Какой тип курица становится:

console.log(769 + 3.8 + 10/38);