RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1283959
Accepted
JamesBondCaesar
JamesBondCaesar
Asked:2022-05-20 04:55:08 +0000 UTC2022-05-20 04:55:08 +0000 UTC 2022-05-20 04:55:08 +0000 UTC

加倍 C#

  • 772

长的适合双吗?两者都有 8 个字节,但也许有一些我不知道的细微差别?

莫非是long转换成double后,反向转换就不对了?

添加

任务,以 Double 格式保存日期。我将 DateTime.Ticks 转换为双精度格式,并将其与文件中对应的数据数组一起保存为位。像这样的东西:日期值值日期值值日期值值日期值值

这里有可能崩溃吗?日期不超过当前日期(嗯,它每天增加)并且不少于 2000

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Qwertiy
    2022-05-20T05:40:24Z2022-05-20T05:40:24Z

    长的适合双吗?那里和那里都有 8 个字节

    不。显然,在同样大小的情况下,这是不可能的。有相同的卷,它long存储没有冗余的数字(即每个位组合对应一个唯一的数字)。不增加体积,就不可能保存新的值(都是小数,甚至只多一个小数,比如0.5)。并且由于已知 double 可以存储超过 long 的值,很明显它不能存储所有 type 的值long。

    莫非是long转换成double后,反向转换就不对了?

    double可以精确存储整数,包括 2**53(模数)。在此范围内,转换将是准确的,并且计算也仅适用于整数。一旦超出此范围,最低有效位就会开始丢失。

    https://ideone.com/HSBgd5

    using System;
    
    public class Test
    {
      public static void Main()
      {
        long x = (1L << 53) + 17;
        double y = x;
        long z = (long)y;
        
        Console.WriteLine(x);
        Console.WriteLine("{0:0}, last digits: {1}", y, y % 10000.0);
        Console.WriteLine(z);
      }
    }
    
    9007199254741009
    9007199254741010, last digits: 1008
    9007199254741008
    

    相反,08输出的是10一个斜面输出,实际上存储了带有八的值。

    我将 DateTime.Ticks 转换为双格式

    并且数据丢失了。我可以自己检查一下:https ://ideone.com/knqMBs

    using System;
    
    public class Test
    {
      public static void Main()
      {
        Console.WriteLine(DateTime.MinValue.Ticks);
        Console.WriteLine(DateTime.MaxValue.Ticks);
        Console.WriteLine(1L << 53);
        Console.WriteLine(DateTime.Now.Ticks);
        Console.WriteLine(new DateTime(1L << 53));
      }
    }
    
    0
    3155378975999999999
    9007199254740992
    637570616761754540
    7/17/0029 11:58:45 PM
    

    double 的确切范围涵盖了直到 0029 年(不是 2029 年,而是 00 - 大约 2000 年前)的年份。对于现代日期,您会丢失大约 7 个最后位。

    或者像这样:https ://ideone.com/UvZfic

    using System;
    
    public class Test
    {
      public static void Main()
      {
        var date0 = DateTime.Now;
        double dbl = date0.Ticks;
        var date1 = new DateTime((long)dbl);
        
        Console.WriteLine(date0.ToString("yyyy_MM_dd HH:mm:ss.fffffff"));
        Console.WriteLine(date1.ToString("yyyy_MM_dd HH:mm:ss.fffffff"));
    
        Console.WriteLine(date0.Ticks);
        Console.WriteLine(date1.Ticks);
      }
    }
    
    2021_05_19 23:10:44.7633170
    2021_05_19 23:10:44.7633152
    637570626447633170
    637570626447633152
    

    顺便说一句,一个有趣的事实:VB6、VBA 和 MS Office 使用双精度来存储日期,但它们的做法不同:整数部分是从倒计时开始的天数,小数部分是时间。自然,与滴答声相比,准确性仍然受到影响。


    关于该主题的有趣材料:

    • https://ru.stackoverflow.com/a/734615/178988
    • 在 long double 中丢失 1 位
    • 数字显示9223372036854775807
    • https://stackoverflow.com/q/1421520/4928642
    • 5
  2. Blackmeser
    2022-05-20T11:35:51Z2022-05-20T11:35:51Z
    for(long i = long.MaxValue; i > long.MaxValue-100000; i-=2000)
    {
        Console.WriteLine($"long = {i}\r\ndouble={((double)i).ToString("F3")}\r\n");
    }
    

    你需要这样的错误吗?

    • 0

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5