Проблема с числами с плавающей точкой.
В общем суть такая. Пытаюсь решить задачку на одном ресурсе
ссылка на условие в оригинале На вводе имеется Float-число с четырьмя знаками после точки. Необходимо создать массив и вывести в консоль последовательно убывающую геометрическую прогрессию этого числа длинной в сто элементов. При этом каждое число должно отборажаться с также с четырьмя знаками после точки. Пример ввода и вывода: Ввод: 200.0000 Вывод: N[0] = 200.0000 N[1] = 100.0000 N[2] = 50.0000 N[3] = 25.0000 N[4] = 12.5000 ...бла бла и так до N[99] Я если честно опробовал уже тучу разных вариантов , и всё равно при проверке получаю 5 процентов неверного вывода. Подозреваю , что проблема при неправильном округлении метода .toFixed(), но как её побороть ума не приложу .. помогите плс, может кто хорошо в этой теме шарит. Вот несколько вариантов моих решений:
var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');
let x = parseFloat(lines[0]).toFixed(4);
let N=[],i,temp=0;
N[0] = x;
console.log(`N[${0}] = ${x}`);
for (i = 1; i < 100; i++){
temp = (Math.floor((N[i-1])*10000)/10000);
N[i] = temp/2;
let string = String(Math.floor((N[i])*10000)/10000);
let float = parseFloat(string).toFixed(4);
console.log(`N[${i}] = ${float}`);
}
------
let x = parseFloat(lines[0]);
let N=[],i,temp=0;
console.log(`N[0] = ${x.toFixed(4)}`);
for (i=1; i<100; i++) {
N[i] = (x*10000/10000) / (Math.pow(2 ,i));
console.log(`N[${i}] = ${parseFloat(N[i]).toFixed(4)}`);
}
-----
let x = parseFloat(lines[0]);
let N=[];
N[0] = x;
for (let i=1; i<100; i++) {
N[i] = ((x*10000) / (Math.pow(2 ,i)) / 10000);
let temp = String(N[i].toFixed(5));
let compare = temp.substring(6);
if (compare === '5'&& temp>0.00005) {
N[i] = N[i].toFixed(4) - 0.0001;
}
}
for (let i=0; i<100; i++) {
console.log(`N[${i}] = ${(N[i].toFixed(4))}`);
}
|
Цитата:
<script>
var n = 200.0000;
n *= 10000;
for (var i = 0; i < 100; i++) {
document.write(i + " - " + (n/10000).toFixed(4) +"<br>");
n /=2;
}
</script>
|
8 - 0.7813 - в данном конкретном выводе вот тут 0.7812 верно :)
|
Цитата:
|
const n = 200.0000
const length = 100
const N = []
for (let i = 0; i < length; i++) {
N[i] = Math.floor((i ? N[i - 1] / 2 : n) * 10000) / 10000 // урезание
}
N.forEach((n, i) => {
console.log('N[%d] = %s', i, n.toFixed(4))
})
Цитата:
|
Вложений: 1
|
friosound,
lires??? |
нет , нет ..там всё верно написано. Это у меня скриншот почему-то в паинте так коряво отображает.
|
Если задача предполагает округление, тогда мне тоже непонятно, почему элемент с индексом 8 не засчитан:
Код:
i | 8 | 11То есть, в индексе 8 предполагается урезание, а уже в индексе 11 - округление. При этом, при решении через округлении только индекс 8 неверен. |
проблема в том , что это - автоматическая система тестирования. Имеется непонятно какое количество валидных выводов , которые , как я понимаю сравниваются с моими при отправке кода.
Что касается выводов - не факт , что не засчитывает именно этот случай. Я сравниваю вывод каждого решения , запуская его в node и потом сравниваю с ''якобы'' валидными вариантами вот здесь: https://www.udebug.com/URI/1178 - ссылка на этот ресурс висит в условии задачи , как рекомендуемая для проверки. Моё третье решение предполагает принудительное урезание, и вот тогда на Udebug часть выводов у меня идентичны , но при попытке сравнить вывод числа 100000000000000000000.0000 - уже один элемент меньше , т.е. предполагается округление. Что интересно, смотрел решения на java или C , и там у ребят проходят проверку варианты с округлением т.е. 8 элемент 0.7813 при числе 200.0000 |
| Часовой пояс GMT +3, время: 00:57. |