关于JS/C#浮点数的简单问题。我正在制作多人游戏,通常需要在客户端和服务器之间同步数据。现在的问题是,C#浮点数和Javascript浮点数是相同的数据类型吗?比如说,我可以将一个浮点数发送到另一个上,并且它们能够相互理解。我将使用科学计数法发送浮点数,因为我认为这样会更短更精确,除非你们有其他想法 :)
提前感谢。
关于JS/C#浮点数的简单问题。我正在制作多人游戏,通常需要在客户端和服务器之间同步数据。现在的问题是,C#浮点数和Javascript浮点数是相同的数据类型吗?比如说,我可以将一个浮点数发送到另一个上,并且它们能够相互理解。我将使用科学计数法发送浮点数,因为我认为这样会更短更精确,除非你们有其他想法 :)
提前感谢。
C# double
和JavaScript 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")
包含一个不必要的额外数字。
我将发送科学计数法表示的浮点数
为什么不使用JSON发送数据呢?它运作得非常好,可以避免你发明一种新的传输格式。
float
或int
或long
。它只有一种数字类型,即Number
,它是一个64位IEEE-754数字。 - T.J. Crowder.ToString
/toString()
不同。例如,在两者中比较0.87090686143883822
的字符串表示形式,并使用.ToString()
和.ToString("R")
,C#将给出与JavaScript不同的值。这可能不会引起任何问题,或者如果您往返传递任何值并期望它们的字符串表示形式相同,则可能会引起问题。 - yeerk.ToString("R")
。 :-) - T.J. Crowder