C#C Float和JavaScript号码的小数
C# decimal to C++ float and javascript number
我有一个用C#编写的TCP服务器。我必须写两个客户端(C 和JavaScript)。我可以在c#客户端中进行十进制(16byte -128bit)的序列化,但我无法对其他语言进行挑选。
小数不太大,我可以使用浮子或双重。
序列化十进制:
MemoryStream combinedMessage = new MemoryStream();
decimal d = 2135102.06m;
using (BinaryWriter writer = new BinaryWriter(combinedMessage, encoding))
{
writer.Write(d);
}
byte[] message = combinedMessage.ToArray();
序列化为:
62 232 185 12 0 0 0 0 0 0 0 0 0 0 2 0
我如何从c 和javaScript中的字节[]进行十进制?
前12个字节是一个小端96位整数,字节13和14均未使用(目前),字节15包含比例(10的幂),字节16包含MSB中的符号(其他位位)。主要的困难在于准确的转换 - 即使小数是"不太大",也可以以或多或少的准确性将其转换为float
或Number
。
以下例程不一定是转换小数的最准确方法,也不是最快的方法,但是如果您不太关心准确性或速度,它将完成工作,并且可以轻松实现工作转化为大多数类似C的语言。在这里,它在JavaScript中:
var b = [ 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 ];
var d = 0.0;
for (var i = 11; i >= 0; --i) {
var k = b[i];
for (var j = 0; j != 8; ++j) {
d *= 2;
d += (k & 0x80) >> 7;
k <<= 1;
}
}
var scale = b[14];
d /= Math.pow(10, scale);
if (b[15] >= 0x80) d = -d;
这几乎是有效的C#;您需要更改的只是Math.Pow
和byte[] b = { 62 ... }
。对于C(和扩展C ),这些变化并不复杂得多:
#include <math.h>
unsigned char b[] = { 62, 232, 185, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 };
double d = 0.0;
for (int i = 11; i >= 0; --i) {
unsigned char k = b[i];
for (int j = 0; j != 8; ++j) {
d *= 2;
d += (k & 0x80) >> 7;
k <<= 1;
}
}
int scale = b[14];
d /= pow(10, scale);
if (b[15] >= 0x80) d = -d;
相关文章:
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 程序不断发送垃圾邮件号码?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 返回浮点数的小数位数
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 在C++中使用线程查找友好号码比单个线程花费更多时间
- 插入号码后C++崩溃
- 在数学上将浮点数四舍五入到 N 位小数
- C++ 电话号码字母拨号程序 - 语法错别字?还是非 ASCII 字符?
- 打印双精度的整个非小数部分
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如何在C++中对OpenCV垫的小数进行四舍五入?
- 将 int 数组转换为带有小数C++的双精度数组
- Arduino如何制作返回固定大小数组的函数
- C#C Float和JavaScript号码的小数
- C++号码。ToString( "F" ) 选择作为小数分隔符