2017-08-05 73 views
1

我试图将一串长度的数字转换为一个double,以便将其用作redis数据库的索引(redis需要双精度型),但转换不是正确,以便数据库抓取变得混乱。c#中的Convert.ToDouble在访问redis数据库时没有给出正确答案

这里是一个字符串转换成一个双

string start="636375529204974172"; 
ulong istart = Convert.ToUInt64(start); // result 636375529204974172 
double dstart = Convert.ToDouble(istart); // result 6.3637552920497421E+17 

,你可以看到,当我ISTART转换为双象DSTART,一些最显著位被搞砸的问题开始的代码,似乎通过在那里引入E + 17的转换。

我不明白为什么,它的一个整数,没有小数部分来创建错误,为什么它不能做到这一点?

有谁知道如何解决从字符串转换为双?

+0

我也这么认为,但同时我只是用E + 17所以它应该工作的右双去E + 308 ? –

+0

尝试使用“十进制”更精确 – edtheprogrammerguy

+0

为什么十进制更精确的双精度? – jdweng

回答

4

我不明白为什么,它的一个整数,没有小数部分来创建错误,为什么它不能做到这一点?

由于它仍然只有64位信息可供使用,其中52个用于尾数,其中11个用于指数,其中1个用于符号。

基本上你不应该依赖double中精度超过15个十进制数字。来自docs for System.Double

所有浮点数的有效数字位数也是有限的,这也决定了浮点值接近实数的精确程度。 Double值最多有15个十进制数字的精度,但内部最多保留17位数字。

您的值的前15位有效数字是 correct - 这里没有任何问题。最近double价值,你的原始值恰好是636375529204974208.有没有double这恰恰代表636375529204974172.

+1

theres总是有些东西搞砸了,我的整个程序使用了 –

+0

我想出的解决方案是从当前日期时间滴答减去2017年1月1日的滴答数,这创建了一个更小的滴答大小,然后我用而不是 –

+0

@PaulMan:如果你正在处理ticks,你不能使用整数类型吗?或者Redis仅支持浮点值? –

相关问题