JavaScript浮点数与C#浮点数的比较

4

关于JS/C#浮点数的简单问题。我正在制作多人游戏,通常需要在客户端和服务器之间同步数据。现在的问题是,C#浮点数和Javascript浮点数是相同的数据类型吗?比如说,我可以将一个浮点数发送到另一个上,并且它们能够相互理解。我将使用科学计数法发送浮点数,因为我认为这样会更短更精确,除非你们有其他想法 :)

提前感谢。

2个回答

7

C# doubleJavaScript Number是同一类型,都是双精度(64位)IEEE-754二进制浮点数(“binary64”)。(C# float只是单精度[32位,“binary32”],因此如果您想使用与JavaScript相同的东西,请使用double而不是float。)


顺便说一下:尽管它们是相同的数字类型,但它们各自的“to string”操作略有不同。例如,给定数字0.87090686143883822(实际上是0.8709068614388382201241256552748382091522216796875,最接近的IEEE-754二进制64可以保持的值),来自C#,JavaScript和Java的“to string”操作分别如下:

0.870906861438838   - C#'s ToString()
0.87090686143883822 - C#'s ToString("R")
0.8709068614388382  - JavaScript's toString()
0.8709068614388382  - Java's String.valueOf(double)

我不知道C#的规则,但是JavaScript和Java都默认只包括足以区分数字与其最近可表示邻居的位数。 C#的ToString()没有这样做(0.870906861438838转换为0.870906861438838,精确地失去了剩余的0.0000000000000002201241256552748382091522216796875)。 C#的ToString("R")包含一个不必要的额外数字。


哦,我明白了,Javascript中的“float”实际上是双精度浮点数,也就是64位浮点数。谢谢,这意味着我需要在C#中使用double。没问题!感谢您清晰的回答! - Vili Volcini
1
@KoBi:JavaScript根本没有floatintlong。它只有一种数字类型,即Number,它是一个64位IEEE-754数字。 - T.J. Crowder
这就是我问的原因,我有点确定JS使用32位浮点数作为变量数字。 - Vili Volcini
1
@KoBi:不是的。 :-) 它确实有一些数学运算(例如位运算符),在操作期间会将数字临时转换为32位整数格式,但除此之外,其他都是浮点数。 - T.J. Crowder
1
需要注意的一点是,虽然C#中的doubles和JavaScript中的Numbers是相同的,但它们的.ToString/toString()不同。例如,在两者中比较0.87090686143883822的字符串表示形式,并使用.ToString().ToString("R"),C#将给出与JavaScript不同的值。这可能不会引起任何问题,或者如果您往返传递任何值并期望它们的字符串表示形式相同,则可能会引起问题。 - yeerk
@yeerk - 这是一个需要注意的好事情,谢谢!我已经更新了答案。我想要的结论是,在C#中序列化双精度浮点数时,请务必使用.ToString("R")。 :-) - T.J. Crowder

1

我将发送科学计数法表示的浮点数

为什么不使用JSON发送数据呢?它运作得非常好,可以避免你发明一种新的传输格式。


在C#中使用JSON很麻烦,而且会增加服务器和客户端的额外开销。我曾尝试过使用JSON,但最终放弃了。如果游戏很大,使用JSON可能会有好处。但这只是一个简单的在线贪吃蛇游戏,所以你可以想象新的传输格式只需要简单的字符串分词和解析 :) - Vili Volcini

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