2013-05-07 6 views
1

Я знаю, что это может быть рано, но сейчас я очень запутался .. Я Установка RGBA цвета в CSSCSS поплавок против Javascript поплавка

#body{ color: rgba(100,100,100,0.3) } 

Когда я прошу Javascript, чтобы дать мне вычисленный стиль этого элемента, я получаю это:

window.getComputedStyle(document.body)['color'] 
//rgba(100, 100, 100, 0.298039) 

Где я ожидал rgba(100,100,100,0.3).

Мой вопрос: Почему?

Как это возможно и как мне обойти это?

+2

Вы можете рассказать разницу между 0,3 и 0,298039? – Barmar

+0

@ Бармар Это не главное. OP хочет знать, как это происходит и почему. – Aquillo

+1

@Aquillo - Они также спрашивают, как обойти это. Нам нужно знать, какая фактическая проблема (если таковая имеется) вызывает их. –

ответ

8

Все поля спецификации rgba(), кажется, преобразуются внутренне в 8-разрядные байты. 0.3 будет round(0.3 * 255) = 76. Когда он преобразуется обратно в формат rgba, он вычисляет 76/255 = 0.298039. Поскольку он не хранится как десятичная или плавающая точка, он теряет точность во время этого процесса - нет способа узнать, что такое исходная настройка.

Нет никакой разницы в фактическом внешнем виде дисплея, поскольку внутренняя 8-битная альфа-это то, что фактически используется при рендеринге.

+0

Очистить .. очень ясно – HerrWalter

+0

Нет, но если я хочу проверить цвет RGBA, вы можете сделать тот же caluclation, чтобы он соответствовал css. Благодаря! – HerrWalter

+0

+1 для фактического объяснения корня присутствия здесь! Интересно посмотреть, как это работает. – Aquillo

3

Плавающая точка на большинстве языков, включая javascript, не является точным. Многие числа, такие как 0,3, не могут быть представлены точно с учетом того, как хранятся числа с плавающей запятой. Если вы хотите сравнить два числа с плавающей запятой, типичный способ, которым это делается, - округлить их до пары десятичных знаков перед сравнением, и любые различия исчезнут в округлении.

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

Если у вас есть причина для хранения точного значения и сохранения этого точного значения, преобразуйте его в строку и сохраните строку в пользовательском свойстве объекта. Свойство точно сохранит строковое значение. Если вы преобразуете эту строку обратно в float, вам все равно придется жить с ограничениями точности с плавающей запятой, но она должна быть намного более точной, чем вы видели со значением непрозрачности.

Поскольку нет видимой разницы между непрозрачностью 0,3 и 0,298039, можете ли вы описать, в чем проблема на самом деле?

+0

Это правда, но обычно разница похожа на 7-е или 8-е десятичное место. – Barmar

+0

@ Бармар - Я не знаю, почему есть такая разница. – jfriend00

+0

@Aquillo Поплавки Javascript должны быть 64-битными с плавающей запятой. – Barmar

Смежные вопросы