Комментарии 20
Хорошая новость заключается в том, что современные браузеры будут учитывать десятичные значения в блочной модели, в том числе в процентных или пиксельных единицах измерения.
Плохая новость в том, что в вебките размеры отрисовки будут скакать на 1 пиксель туда-сюда. Например, однопиксельный бордюр будет местами двухпиксельным, а местами его вообще не будет.
А самое печальное, что это касается и таких значений как: 1%, 1.2rem, 1.2em, 10vmin, 10vh, 10vw и тд. Короче, чтобы всё было хорошо, получаемые в результате пиксельные размеры должны быть целыми.
Скакать на пиксель туда или сюда в одном и том же окружении он не будет. Под одним и тем же окружением я понимаю то от чего берется процент для относительной единицы. Грубо говоря, если размер области 100 пикселей, то позиция элемента left 3.7px всегда будет в одном и том же месте и скакнуть на пиксель влево или вправо может только в случае изменения размера области.
Равно и в случае с бордером. Он никогда не будет нулевым. Может быть меньше может быть больше, но не нулевой. Исключение только в случаях когда область просмотра масштабируется в область с меньшим разрешением.
Тут проблема в том, что в разных местах происходит округление в разную сторону и получаются артефакты типа этих: https://jsfiddle.net/sb4206bz/1/
Насчёт пропадания именно бордера — у меня не получилось сейчас воспроизвести (получилось только для box-shadow: https://jsfiddle.net/sb4206bz/2/). Возможно в свежих билдах хрома это пофиксили, а возможно я не так воспроизвожу. Но проблемы такие были. По той же причине.
наспамьте в ЛС ссылок на тригонометрические либы, 2д, 3д, всё то что про геометрию 7-11 классов+
мучительно и долго самому всё это кодить, хочется библиотек.
Спасибо.
return Math.round(Math.random());
вместо
return Math.floor(Math.random() * 2);
Из-за неточности вычислений с плавающей запятой, очень редко может возникать ситуация неправильного округления. ссылка
Метод floor работает гораздо проще и просто возвращает ближайшее целое число, которое меньше или равно указанному.
Таким образом, вместо ненадежного round() мы умножаем рандомное число на 2, результатом чего всегда будет число в промежутке [0,2) без каких-либо округлений. После чего надежно используем floor() и получаем 0 или 1.
function truncated(num, decimalPlaces) { let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; }
Теперь я понимаю, чем занято одно из ядер моего процессора на 100%, когда я открываю простенькую HTML страничку, на которой 200 чисел, округленных до 6 знаков после запятой.
function truncated(num, decimalPlaces) {
let numPowerConverter = Math.pow(10, decimalPlaces);
return ~~(num * numPowerConverter)/numPowerConverter;
}
> truncated(0.12345678912345678, 17)
> 1.578423886e-8
Простая замена ~~ на Math.round возвращает точность:
function truncated(num, decimalPlaces) {
let numPowerConverter = Math.pow(10, decimalPlaces);
return Math.round(num * numPowerConverter)/numPowerConverter;
}
> truncated(0.12345678912345678, 17)
> 0.12345678912345678
function coinToss() { return Math.random()<.5; }
Но ведь в данном случае true будет чаще встречаться, чем false.
Math.random() генерирует случайное число от 0 до 0.9999999999999999, следовательно надо сравнивать не с 0.5, а с 0.49999999999999994 либо 0.49999999999999995, чтоб иметь наиболее честный результат.
function truncated(num, decimalPlaces) {
let numPowerConverter = Math.pow(10, decimalPlaces);
return ~~(num * numPowerConverter)/numPowerConverter;
}
> truncated(0.12345678912345678, 17)
> 1.578423886e-8
Простая замена ~~ на Math.round возвращает точность:
function truncated(num, decimalPlaces) {
let numPowerConverter = Math.pow(10, decimalPlaces);
return Math.round(num * numPowerConverter)/numPowerConverter;
}
> truncated(0.12345678912345678, 17)
> 0.12345678912345678
Если понадобится прецизионная точность работы с числами, то MathJS в помощь: можно указать точность 64 (и больше) бит и уже 0.1 + 0.2 === 0.3
Про ГПСЧ:
Если возможности позволяют, то два и более ГПСЧ (с разных устройств) помогают создать нормальный рандом. В отдельных случаях движения мыши вполне годны для ГСЧ.
Математика в JavaScript