десятичные знаки, javascript против С#

Я пытаюсь преобразовать хэш-функцию JavaScript в хеширование С#, чтобы сделать то же самое. Я на 99% там, но я столкнулся с проблемой десятичных знаков, используемых в этой пользовательской функции.
Не знаю, почему, но эта функция преобразует хэшированное значение в десятичное по какой-то странной причине, и моя проблема в том, что сгенерированные десятичные числа не всегда такой же длины. Десятичные дроби в C# немного длиннее, но имеют одинаковую длину. Проблема, с которой я сталкиваюсь, заключается в том, что округление в С# работает иначе, чем в JavaScript. Я точно не знаю, с каким десятичным числом округлить, чтобы создать строку эквивалентной длины.

Вот пример двух сгенерированных десятичных строк, которые добавляются друг к другу. Оба начинаются со строк из 4,4 и 3 символов:

4 char string generates 79957.88183577501
4 char string generates 160933.02806113224
3 char string generates 609.9111294990053

Используя точно такой же код, который генерирует C#, используя те же входные данные:

79957.88183577500452161331162
160933.02806113221197323204919
609.91112949900524507144149035

Если бы все строки были одинаковой длины, это не было бы проблемой, но я понятия не имею, как определить, когда JS сгенерирует более длинное десятичное число. Любые подсказки? Комментарии? Мнения?

К сожалению, принимающий код по-прежнему является исходным JS, который просто меняет процесс, поэтому мне приходится идеально дублировать конечный результат для всех входных данных.

РЕДАКТИРОВАТЬ:

Вот проблемный раздел. Не спрашивайте меня, почему это так работает, я это не писал.

// oString is a full string to be encoded
// oKey is a key to be used for encoding
function completeHash(oString,oKey) {
    if( oKey.length < 5 ) {
        window.alert( 'The key must be at least 5 characters long' );
        return oString;
    }
    var oKeyNum = new Array(), oOutStr = '', oOp = new Array('+=','/=','-=','*= 0.01 *');
    for (var x = 0; x < oKey.length; x++) {
        oKeyNum[x] = parseInt('0x' + completeEscape(oKey.charAt(x)));
    }

    for( var x = 0, y = ''; x < oString.length; x += Math.round( oKey.length / 2 ), y = 'O.O' ) {
        var theNum = parseInt( '0x' + completeEscape( oString.substr( x, Math.round( oKey.length / 2 ) ) ) );

        // next two lines are problematic with decimals not having equal length
        for( var z = 0; z < oKey.length; z++ ) {
            eval( 'theNum ' + oOp[z % 4] + ' ' + oKeyNum[z] + ';' );
            alert('theNum:' + theNum);
        }

        oOutStr += y + theNum;
    }
    return oOutStr;
}

Функция completeEscape() просто возвращает коды ASCII int для каждого символа.

У меня все работает хорошо, кроме длины десятичных знаков.


person IcantSpell    schedule 23.10.2012    source источник
comment
Почему именно ваш хеш десятичный в первую очередь? Если вам нужен точный обмен значениями, не используйте тип данных, который по своей сути подразумевает преобразование с потерями.   -  person millimoose    schedule 24.10.2012
comment
Значит, хеш — это действительно закодированная строка? Хэши обычно являются односторонними вычислениями.   -  person Tejs    schedule 24.10.2012
comment
Не могли бы вы показать код javascript и его реализацию на С#?   -  person Magnus    schedule 24.10.2012
comment
не могу показать код, иначе меня, вероятно, уволят :)   -  person IcantSpell    schedule 24.10.2012
comment
Возможно, часть его, которая демонстрирует проблему.   -  person Magnus    schedule 24.10.2012
comment
что касается того, почему хэш становится десятичным? я не знаю, этот код был написан задолго до меня и теперь является проблемой, поэтому его нужно преобразовать в другую сторону. позвольте мне посмотреть, что я могу безопасно опубликовать.   -  person IcantSpell    schedule 24.10.2012
comment
Кстати, когда вы говорите Decimal, вы имеете в виду значение с плавающей запятой? Насколько мне известно, в javascript нет типа данных Decimal.   -  person Magnus    schedule 24.10.2012
comment
да с плавающей запятой. я называю это десятичным в моей голове, так как я в основном делаю C #   -  person IcantSpell    schedule 24.10.2012


Ответы (2)


Если вы используете Number в javascript, используйте double в C#. Оба являются 64-битными числами IEEE 754 (двойной точности). Вы получаете те же значения (обновлены после проверки).

person Peter Ivan    schedule 24.10.2012

Я думаю, что ваша проблема связана с ограничением javascript на десятичные числа с двойной точностью. Это дает вам около 16 цифр точности. Вам нужно будет рассмотреть возможность использования обходного пути на основе строк. Дополнительную информацию, включая обходной путь, можно найти здесь ie7">Как я могу обрабатывать числа больше 17 цифр в Firefox/IE7?

person alistair    schedule 24.10.2012
comment
это то, что я подумал в какой-то момент, но потом иногда вижу 17-значное число, как в примере № 2 в OP. - person IcantSpell; 24.10.2012
comment
Проведя немного больше исследований, я точно не нашел решения, но я разработал другие идеи по решению проблемы без использования этого кода, поэтому я не могу опубликовать ответ на этот. Может быть, однажды я найду ответ. Спасибо всем! - person IcantSpell; 25.10.2012