Я думаю, что лучший способ, которым я видел, это умножить на 10 на степень числа цифр, затем сделать Math.round, затем, наконец, разделить на 10 на степень цифры. Вот простая функция, которую я использую в машинописи:
function roundToXDigits(value: number, digits: number) {
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
Или простой javascript:
function roundToXDigits(value, digits) {
if(!digits){
digits = 2;
}
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
Обратное проектирование двоичного формата опасно, если вы собираетесь поставлять свой кодек, созданный методом обратного проектирования. Они могут изменить формат файла без предупреждения. Однако, если вы связаны и полны решимости сделать это:
Вы могли бы сделать одно - посмотреть на формат чисел с плавающей запятой IEEE:
http://steve.hollasch.net/cgindex/coding/ieeefloat .html
И затем, начиная с первого байта файла, прочтите 4 или 8 байтов данных. Преобразуйте оба набора (4 байта и 8 байтов) в значения с плавающей запятой и двойные. Проверьте, соответствуют ли они значениям, которые, как вы знаете, находятся в файле. Если да, то вы, вероятно, нашли компенсацию цены. Распечатайте его плюс смещение. Если нет, увеличьте поиск на один байт и повторите попытку.
Если вы можете найти все значения таким образом, тогда вы сможете безопасно исправить двоичные файлы во время выполнения, выполнив аналогичную операцию: поискать цены, которые, как вы знаете, есть, и затем изменить значения цен в нужном месте.
Это вовсе не надежно. , потому что случайные последовательности данных иногда совпадают. Если вы заметили определенное расстояние между смещениями или какую-то сигилу, которая всегда присутствует, или, возможно, даже лучше, если вы сможете найти эти значения смещения обратно в файле, у вас может быть что-то умеренно стабильное.