为什么 C# 允许从 Long 到 Float 的“隐式”转换,而这可能会丢失精度?

2024-02-26

类似的问题长时间处于浮动状态,为什么? https://stackoverflow.com/questions/4352213/long-in-float-why这里没有回答我正在寻找的内容。

C# 标准允许从 long 到 float 的隐式转换。 但是任何大于 2^24 的 long 当表示为浮点时必然会失去其“值”。 C# 标准明确规定,long 到 float 的转换可能会失去“精度”,但永远不会失去“幅度”。

My Questions are
  1. 关于整数类型,“精度”和“幅度”的含义是什么。数字 n 是否与数字 n+1 完全不同,与实数不同,其中 3.333333 和 3.333329 可能被认为足够接近以进行计算(即取决于程序员想要的精度)
  2. 不允许从 long 到 float 的隐式转换会引发微妙的错误,因为它可能导致 long “默默地”失去价值(作为一名 C# 程序员,我习惯于编译器在防止此类问题方面做得非常出色)

那么 C# 语言设计团队允许这种隐式转换的理由是什么?我在这里缺少什么来证明从 long 到 float 的隐式转换是合理的?


这是一个很好的问题。实际上你可以概括这个问题,因为隐式转换也存在同样的问题:

  • int to float
  • uint to float
  • long to float (你问的是)
  • ulong to float
  • long to double
  • ulong to double.

实际上,所有积分类型(乃至char!!) 隐式转换为float and double;但是,只有上面列出的转换会导致精度损失。另一个值得注意的有趣的事情是,C# 语言规范在解释“为什么没有从十进制到双精度的隐式转换”时有一个自相矛盾的论点:

小数类型比浮点类型具有更高的精度,但范围更小。因此,从浮点类型到十进制的转换可能会产生溢出异常,从十进制到浮点类型的转换可能会导致精度损失。由于这些原因,浮点类型和十进制之间不存在隐式转换,并且如果没有显式转换,就不可能在同一表达式中混合浮点和十进制操作数。

我认为,“为什么做出这个决定”的问题最好由像埃里克·利珀特这样的人来回答。我最好的猜测......这是语言设计者没有任何强有力的论据支持一种或另一种方式的事情之一,所以他们选择了(他们认为的)更好的替代方案,尽管这是有争议的。在他们的辩护中,当你转换大量long to float,你确实失去了精度,但你仍然得到了最佳代表浮点世界中的那个数字。这与转换,比如说,int to byte可能存在溢出的地方(整数值可能超出了范围)byte可以代表),你会得到一个不相关/错误的数字。但在我看来,如果没有隐式转换,这会更加一致decimal到浮点,如果它们没有其他导致精度损失的转换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C# 允许从 Long 到 Float 的“隐式”转换,而这可能会丢失精度? 的相关文章

  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • 使用 apachesoap:使用 .net 在 Web 服务中映射复杂数据类型

    我有一个用 Coldfusion 编程的 Web 服务 我试图使用 c net 来使用它 特定的 Web 服务返回一个 Coldfusion 结构 具有键和值的项目的集合 该结构由 Web 服务公开为 apachesoap Map 类型的复
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐