Числа с плавающей запятой, хранящиеся в компьютере, состоят из двух частей: целого и экспоненты, в которых база берется и умножается на целую часть.
Если компьютер работал в базе 10, 0.1
будет 1 x 10⁻¹
, 0.2
будет 2 x 10⁻¹
, а 0.3
будет 3 x 10⁻¹
. Целочисленная математика проста и точна, поэтому добавление 0.1 + 0.2
, очевидно, приведет к 0.3
.
Компьютеры обычно не работают в базе 10, они работают в базе 2. Вы все равно можете получить точные результаты для некоторые значения, например 0.5
, равны 1 x 2⁻¹
, а 0.25
- 1 x 2⁻²
, а их добавление приводит к 3 x 2⁻²
или 0.75
. Точно.
Проблема связана с числами, которые могут быть представлены точно в базе 10, но не в базе 2. Эти цифры должны округляться до их ближайшего эквивалента. Предполагая, что для 64-битного формата с плавающей точкой IEEE используется очень общий формат, ближайшим номером к 0.1
является 3602879701896397 x 2⁻⁵⁵
, а ближайшим номером к 0.2
является 7205759403792794 x 2⁻⁵⁵
; добавление их результатов в 10808639105689191 x 2⁻⁵⁵
или точное десятичное значение 0.3000000000000000444089209850062616169452667236328125
. Номера с плавающей запятой, как правило, округлены для отображения.
Вы можете добавить атрибут min
или max
в input type=date
. Дата должна быть в формате ISO (yyyy-mm-dd). Это поддерживается во многих мобильных браузерах и текущих версиях Chrome, хотя пользователи могут вручную вводить недопустимую дату без использования datepicker.
<input name="somedate" type="date" min="2013-12-25">
Атрибуты min
и max
должны быть полной датой; нет способа указать «сегодня» или «+0
». Для этого вам необходимо использовать JavaScript или серверный язык:
var today = new Date().toISOString().split('T')[0];
document.getElementsByName("somedate")[0].setAttribute('min', today);
http://jsfiddle.net/mblase75/kz7d2/
Реализация только сегодня, при разрешении прошлых или будущих дат, здесь не вариант. Однако если вы хотите, чтобы завтра вы были min
датой (гаснет сегодня и все прошлые даты), см. этот вопрос , чтобы увеличить today
на один день.
Как и во всех других случаях, связанных с формами HTML, вы всегда должны проверять полевую серверную сторону независимо от того, как вы ограничиваете ее на стороне клиента.
HTML datepicker (<input type=date>
) поддерживает атрибут min
/ max
, но не поддерживается широко .
Тем временем вы можете рассмотреть возможность использования bootstrap-datepicker , v1.2.0 включен в github .
Ссылки:
Вы можете использовать это, чтобы отключить будущие даты. Внутри функции document.ready
поместите
//Display Only Date till today //
var dtToday = new Date();
var month = dtToday.getMonth() + 1; // getMonth() is zero-based
var day = dtToday.getDate();
var year = dtToday.getFullYear();
if(month < 10)
month = '0' + month.toString();
if(day < 10)
day = '0' + day.toString();
var maxDate = year + '-' + month + '-' + day;
$('#dateID').attr('max', maxDate);
и в форму
<input id="dateID" type="date"/>
Вот рабочий jFiddle Demo