小数,javascript vs C#

Ica*_*ell 11 javascript c# decimal data-conversion

我正在尝试将JavaScript哈希函数转换为C#哈希来完成同样的事情.我99%那里,但我遇到了这个自定义函数中使用的小数点障碍.
我不知道为什么但是这个函数将散列值转换为十进制有一些奇怪的原因而且我的问题是生成的小数并不总是相同的长度.C#中的小数值相当长,但长度均匀.我遇到的问题是因为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;
}
Run Code Online (Sandbox Code Playgroud)

completeEscape() 函数只返回每个字符的ASCII int代码.

除了小数的长度之外,我得到了整个工作.

Pet*_*van 5

如果您Number在 javascript 中使用,则double在 C# 中使用。两者都是 64 位 IEEE 754 数字(双精度)。您得到相同的值(在验证后更新)。