小数点,JavaScript vs C#

12

我正在尝试将一个JavaScript哈希函数转换为C#哈希函数以实现完全相同的功能。我已经完成了99%的工作,但是在这个自定义函数中使用的小数让我遇到了麻烦。
我不确定为什么,但是该函数出于某种奇怪的原因将哈希值转换为小数,我的问题是生成的小数不总是相同的长度。 C# 中的小数要长得多,但长度是一致的。 我的问题是由于C#中的四舍五入与JavaScript不同,我不知道应该在哪个小数位上进行四舍五入才能创建等效长度的字符串。

以下是两个生成的小数字符串的示例,它们被连接在一起。 它们都从 4,4 和 3 个字符字符串开始:

4个字符字符串生成 79957.88183577501
4个字符字符串生成 160933.02806113224
3个字符字符串生成 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代码。

我已经把整件事情做得很好了,除了小数的长度。


6
为什么你的哈希值一开始就是十进制呢?如果你需要精确地往返转换数值,请不要使用那些固有含义为损失转换的数据类型。我应该如何理解这个问题呢? - millimoose
2
所以“哈希”实际上是一个编码字符串?哈希通常是单向计算。 - Tejs
1
不能真正展示代码,否则我可能会被解雇 :) - IcantSpell
至于为什么哈希值会被转换成十进制?我不知道,这段代码是在我之前编写的,现在成为了一个问题,所以必须转换为服务器端。让我看看我能安全发布什么。 - IcantSpell
1
顺便问一下,当你说“Decimal”时,是指浮点数值吗?据我所知,在JavaScript中没有“Decimal”数据类型。 - Magnus
显示剩余3条评论
2个回答

5
如果你在JavaScript中使用Number,那么在C#中请使用double。两者都是64位IEEE 754数字(双精度)。你会得到相同的值(在验证后更新)。

2

我认为你的问题与 JavaScript 对双精度十进制数的限制有关。这给你提供了大约 16 位数字的精度。你需要考虑使用基于字符串的解决方案。更多详细信息,包括解决方案,可以在此处找到:如何在 Firefox/IE7 中处理大于 17 位数字的数字?


那是我曾经的想法,但有时会看到一个17位数字,就像OP中的示例#2。 - IcantSpell
经过更深入的研究,我并没有找到确切的解决方案,但我已经开发出其他处理该问题的想法,而不使用这段代码,因此我无法回答这个问题。也许有一天我会找到答案。谢谢大家! - IcantSpell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接