Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double
. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1
, который является 1/10
), знаменатель которого не является степенью двух, не могут быть точно представлены.
Для 0.1
в стандартном формате binary64
представление может записывается в точности как
0.1000000000000000055511151231257827021181583404541015625
в десятичной форме или 0x1.999999999999ap-4
в нотации C99 hexfloat . Напротив, рациональное число 0.1
, которое является 1/10
, может быть записано точно как
0.1
в десятичной форме или 0x1.99999999999999...p-4
в аналоге обозначения гексафлоата C99, где ...
представляет собой бесконечную последовательность 9. Константы 0.2
и 0.3
в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double
до 0.2
больше, чем рациональное число 0.2
, но ближайший double
до 0.3
меньше, чем рациональное число 0.3
. Сумма 0.1
и 0.2
заканчивается выше, чем рациональное число 0.3
и, следовательно, не согласуется с константой в вашем коде.
Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .
Поскольку вы не указали ни тип содержимого запроса, ни правильный запрос JSON. Вот правильный способ отправки запроса JSON:
var arr = { City: 'Moscow', Age: 25 };
$.ajax({
url: 'Ajax.ashx',
type: 'POST',
data: JSON.stringify(arr),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: false,
success: function(msg) {
alert(msg);
}
});
Замечания:
JSON.stringify
для преобразования объекта javascript в строку JSON который является родным и встроенным в современные браузеры. Если вы хотите поддерживать старые браузеры, вам может потребоваться включить json2.js contentType
, чтобы указать серверу цель отправка запроса JSON dataType: 'json'
используется для типа ответа, который вы ожидаете от сервера. jQuery достаточно умен, чтобы угадать его из заголовка ответа сервера Content-Type
. Поэтому, если у вас есть веб-сервер, который уважает более или менее HTTP-протокол и отвечает на Content-Type: application/json
на ваш запрос, jQuery будет автоматически анализировать ответ в javascript-объекте в обратном вызове success
, так что вам не нужно указывать Свойство dataType
. Осторожно:
arr
, не является массивом. Это объект javascript со свойствами (City
и Age
). Массивы обозначаются символом []
в javascript. Например, [{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]
представляет собой массив из двух объектов. Я написал небольшую удобную функцию для размещения JSON.
$.postJSON = function(url, data, success, args) {
args = $.extend({
url: url,
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: true,
success: success
}, args);
return $.ajax(args);
};
$.postJSON('test/url', data, function(result) {
console.log('result', result);
});
Вам нужно установить правильный тип контента и подкрепить свой объект.
var arr = {City:'Moscow', Age:25};
$.ajax({
url: "Ajax.ashx",
type: "POST",
data: JSON.stringify(arr),
dataType: 'json',
async: false,
contentType: 'application/json; charset=utf-8',
success: function(msg) {
alert(msg);
}
});
Поскольку по умолчанию jQuery сериализует объекты, переданные как параметр data
, на $.ajax
. Он использует $.param
для преобразования данных в строку запроса.
Из документов jQuery для $.ajax
:
[аргумент
blockquote>data
] преобразуется в строку запроса, если уже не строкаЕсли вы хотите отправить JSON, вам придется ее кодировать самостоятельно:
data: JSON.stringify(arr);
Обратите внимание, что
JSON.stringify
присутствует только в современных браузерах. Для устаревшей поддержки загляните в json2.js
Он сериализуется так, чтобы URI мог считывать пары значений имени в запросе POST по умолчанию. Вы можете попробовать установить processData: false в свой список параметров. Не уверен, что это поможет.