Какой маленький у кого-то минусомёт. Совсем крошечный.
Просто холодно!
или наоборот, настолько огромный, что у него начал расти второй уже
А мне нравица. Буду теперь думать что мой коммент избраный.
Размер не главное Т_Т
Может и крошечный, да в бенефисе кринжа судьёй был
С float в базе иногда такая фигня бывает.
дор
Я предполагаю, что это довольно известная проблема 0.1+0.2 = 0.30000000000000004. У неё очень интересная причина: из-за того, что компьютеры хранят числа в двоичной СЧ, многие вещественные числа, которые являются рациональными в 10-ичной СЧ, становятся иррациональными в 2-ичной. А значит, при переводе их обратно появляется небольшая ошибка.
У этой ошибки даже есть свой сайт:
Та эт все понятно, это случается постоянно. Просто разраб забыл toFixed(2) вызвать. С самим постоянно это происходит(
Это одна из причин, по которой приходится делать что-то вроде такого)
@Override
public boolean equals(Object object) {
return object instanceof PointGeo point
&& Math.abs(point.geo_x - this.geo_x) < 0.000009999999747378752
&& Math.abs(point.geo_y - this.geo_y) < 0.000009999999747378752
&& Math.abs(point.z - this.z) < 0.000009999999747378752;
}
public boolean equals(Object object) {
return object instanceof PointGeo point
&& Math.abs(point.geo_x - this.geo_x) < 0.000009999999747378752
&& Math.abs(point.geo_y - this.geo_y) < 0.000009999999747378752
&& Math.abs(point.z - this.z) < 0.000009999999747378752;
}
нет, все гораздо проще, это довольно известная в мире говнокодинга проблема забывания о том, что дроби нужно считать в децималах или использовать примитивы точности, если они доступны в стандартной сборке яп
Разве нельзя хранить десятичные числа как обычные, просто при выводе ставить точку в нужном месте? Я не программист, не шарю
Можно, но тогда неинтересно :3
То, что ты описал, называется числом с фиксированной запятой (fixed point), в противоположность обычным числам с плавающей запятой (floating point).
Числа с плавающей запятой представлены в виде мантиссы и экспоненты:
Это позволяет представлять как очень маленькие числа в районе нуля, так и очень большие числа, но точность (разница между двумя ближайшими числами) будет ниже, чем в области нуля. Чаще всего, это то, что нужно.
Числа с фиксированной запятой более редкий зверь. Они представлены в виде обычных целых чисел, просто при их интерпретации вставляется запятая в нужном месте. Они имели равномерную точность на всем диапазоне, но либо диапазон маленький, либо точность низкая.
Но они все равно двоичные и подвержены ошибкам округления.
Вот например, число 10101 с двумя двоичными знаками после запятой:
1*2² + 0*2¹ + 1*2⁰ + 0*2^(-1) + 1*2^(-2) = 1*4 + 0 + 1*1 + 0 + 1/4 = 5.25
Дробную часть мы можем составлять из суммы степеней двойки: 1/2, 1/4, 1/8, 1/16 итп.
Как видно из этого, что, к примеру, число 0.3 мы точно составить не сможем.
Можно хранить числа с основанием 10, но тогда процессор не сможет работать с ними "из коробки" и нужно будет делать вручную. Во многих языках есть встроенный тип или библиотеки. Используется там, где нужна точность, например, в финансах.
Числа с плавающей запятой представлены в виде мантиссы и экспоненты:
Это позволяет представлять как очень маленькие числа в районе нуля, так и очень большие числа, но точность (разница между двумя ближайшими числами) будет ниже, чем в области нуля. Чаще всего, это то, что нужно.
Числа с фиксированной запятой более редкий зверь. Они представлены в виде обычных целых чисел, просто при их интерпретации вставляется запятая в нужном месте. Они имели равномерную точность на всем диапазоне, но либо диапазон маленький, либо точность низкая.
Но они все равно двоичные и подвержены ошибкам округления.
Вот например, число 10101 с двумя двоичными знаками после запятой:
1*2² + 0*2¹ + 1*2⁰ + 0*2^(-1) + 1*2^(-2) = 1*4 + 0 + 1*1 + 0 + 1/4 = 5.25
Дробную часть мы можем составлять из суммы степеней двойки: 1/2, 1/4, 1/8, 1/16 итп.
Как видно из этого, что, к примеру, число 0.3 мы точно составить не сможем.
Можно хранить числа с основанием 10, но тогда процессор не сможет работать с ними "из коробки" и нужно будет делать вручную. Во многих языках есть встроенный тип или библиотеки. Используется там, где нужна точность, например, в финансах.
На самом деле, как раз для большинства случаев гораздо лучше подходит хранение отдельно целого, и отдельно точки. Если только это не координаты для рендеринга, например, которые надо постоянно считать, и почти никогда не надо выводить.
Все финансы живут строго на целых. Банально лонг - само число(цена, сумма), и ещё байт на позицию запятой. И это лучше подходит для большинства чисел из "реальной жизни". Оценок в том числе. Потому что нет никакого смысла в оценке 2*10-⁶³. Хотя её и можно представить только даблом, в практическом смысле это ноль, кроме специфических случаев.
Все финансы живут строго на целых. Банально лонг - само число(цена, сумма), и ещё байт на позицию запятой. И это лучше подходит для большинства чисел из "реальной жизни". Оценок в том числе. Потому что нет никакого смысла в оценке 2*10-⁶³. Хотя её и можно представить только даблом, в практическом смысле это ноль, кроме специфических случаев.
> Все финансы живут строго на целых. Банально лонг - само число(цена, сумма), и ещё байт на позицию запятой
А в каких случаях это используется? Всегда, когда я работал с финансами (скорее, бухгалтерией) все цены просто хранились в МДЕ (минимальных денежных единицах) и, соответственно, по определению могли быть только целыми. Если же ты считаешь вещественные цены акций на бирже - там будет потеря точности в любой СЧ.
Когда тебе нужны разные валюты вместе, а также разная точность (цены бывают меньше, чем мде иногда), приходится хранить так.
Когда одна валюта, и субценты не нужны, то да, просто мде, там для каждой валюты фиксированная точка(обычно на 2 знаке, но венгры например, такое не прймут, у них 0).
Когда одна валюта, и субценты не нужны, то да, просто мде, там для каждой валюты фиксированная точка(обычно на 2 знаке, но венгры например, такое не прймут, у них 0).
По факту, вот этот мде - это ровно тот же формат, что я описал, просто у тебя второе число, положение точки - константа, потому её нет смысла хранить.
- у моего поста самый длинный рейтинг.
- может самый большой?
Чтобы написать коммент, необходимо залогиниться
Отличный комментарий!