如果十进制的范围更短,为什么它比双精度更精确? C#

2023-11-21

Im reading the C# in a Nutshell book and it shows this table: enter image description here

我很难理解这张桌子。它说双重需要64 bits的空间,它的范围是10^-324 to 10^308。 小数取128 bits空间但也说它的范围从10^-28 to 10^28。那么我在这里的理解是小数占用更多空间但提供更短的范围?这在我看来没有多大意义,因为每个人都同意在需要精度时应该使用小数。 另外,在进行 = 之类的计算时(1/3)*3,期望的结果是1, 但只有float and double给我吗1, decimal给我0.9999...那为什么是decimal更确切?我真的不太明白。


我在这里理解的是小数占用更多空间但提供更短的范围?

正确的。它提供更高的精度和更小的范围。显然,如果位数有限,则只能通过减小范围来提高精度!

每个人都同意当需要精度时应该使用小数

由于这个说法是错误的——特别是我不同意它——你从中得出的任何结论都是不合理的。

使用小数的目的并不是更高的精度。这是较小的表示误差。较高的精度是实现较小表示误差的一种方法,但十进制并不能通过较高的精度来实现较小的表示误差。它通过以下方式实现了较小的表示误差精确表示小数.

小数适用于小数部分的表示错误必须是的情况zero,例如财务计算。

另外,当进行 = (1/3)*3 这样的计算时,期望的结果是 1,但只有 float 和 double 给我 1

你好幸运啊。对于许多分数,浮点数和双精度数的计算表示误差均不为零。

让我们快速检查一下有多少个。我们只需提出一百万个理性,然后看看:

    var q = from x in Enumerable.Range(1, 1000)
            from y in Enumerable.Range(1, 1000)
            where ((double)x)/y*y != x
            select x + " " + y;
    Console.WriteLine(q.Count()); // 101791

超过 10% 的小数有理数被表示为具有足够大表示误差的双精度数,以至于当乘以分母时它们不会变回整数!

如果您希望对任意有理数进行精确算术,那么 double 和decimal 都不是合适的类型。如果您需要精确地表示有理数,请使用大有理数库。

为什么十进制更精确?

小数比双精度更精确,因为它具有更多的精度位。

但同样,精度实际上并不那么重要。相关的是小数具有较小的表示错误对于许多常见分数来说,比两倍要大。

在表示分母为 10 的小幂的分数时,它的表示误差比 double 更小,因为它是专门设计的使分母中具有小十次方的所有分数的表示误差为零。

这就是为什么它被称为“十进制”,因为它代表十的幂的分数。它代表的是十进制,这是我们常用的算术系统。

相比之下,Double 显然没有被设计为具有较小的表示误差。Double 被设计为具有适合物理计算的范围、精度、表示误差和性能。

物理学中不存在对精确的十进制量的偏见。金融界存在这样的偏见。在金融领域使用小数。在物理中使用双打。

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

如果十进制的范围更短,为什么它比双精度更精确? C# 的相关文章

随机推荐

  • Scala 错误:类文件已损坏,常量池索引错误

    我正在尝试从 Scala 调用 Selenium Java 库 我正在使用 Scala IDE Eclipse 和 Scala 2 10 2 是什么导致了这个编译器错误 error while loading Function class
  • 如何使用 django-allauth 访问用户名和配置文件

    我使用 Django 和 django allauth 进行社交身份验证 我已经启动并运行了身份验证 但是任何人都可以举一些简单的示例来说明如何 显示登录用户的姓名和头像 向用户帐户添加一些信息 例如 在主页上 我有 if user is
  • 设置AVMutableComposition的frameDuration

    我正在玩AVEditDemo项目 来自苹果公司WWDC 2010示例包 我正在尝试更改导出视频的帧速率 视频是使用导出的AVMutableComposition其frameDuration设置如下 videoComposition fram
  • PHP-Netbeans:如何更改多条件 if 语句的格式

    我有以下代码 if condition1 condition2 condition3 do something 在让 Netbeans 重新格式化它之后我得到了 if condition1 condition2 condition3 do
  • 在 C# 中使用泛型创建数学库

    是否有任何可行的方法可以使用泛型创建不依赖于选择存储数据的基本类型的数学库 换句话说 假设我想编写一个 Fraction 类 分数可以用两个整数或两个双精度数等来表示 重要的是基本的四种算术运算都有明确的定义 所以 我希望能够写Fracti
  • Java继承——构造函数

    在准备期末考试时 我在我目前正在学习的书中看到了以下陈述 考虑以下代码 class A public A int x class B extends A public B int x 是否强制在B类的构造函数中调用A类的构造函数 super
  • Facebook 请求对话框:本机 iOS 应用程序中的无摩擦请求可能吗?

    截至 2011 年 10 月 10 日 脸书 iOS SDK再次支持 apprequests 对话框 用于从本机 iOS 应用程序发送用户到用户的请求 请参阅Facebook 开发者文档中的屏幕截图举个例子 不过 与通过 Javascrip
  • ASP.Net - 在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的部分是错误的

    我们在开发环境中运行的 Intranet 应用程序上遇到此错误 我不知道去哪里 寻找解决方案 该应用程序曾经工作正常 但它与另一个开发团队在共享服务器上运行 我们在追踪错误时遇到了困难 我的团队没有对应用程序进行任何更新 它突然停止工作 我
  • ASP.Net 中 UI 层的 List<> 比 DataSet 更好吗?

    我想将数据从数据访问层获取到业务层 然后准备在 UI 中使用 所以我想知道 通过以下方式读取我的数据是否更好DataReader并用它来填充List
  • Github 下游拉取请求?

    我在 github 上有一个项目 该项目是 github 上的一个组织分叉的 我可以将我的代码向下游推送到组织的分支吗 我尝试这样做 但没能做到 我想知道我是否可以向下游发送拉取请求 GitHub 确实允许这样做 而且实际上很容易做到 尽管
  • 简单的 PIN 验证

    任务 ATM 机允许使用 4 或 6 位 PIN 码 并且 PIN 码只能包含 4 位或 6 位数字 如果函数传递了有效的 PIN 字符串 则返回 true 否则返回 false 我的解决方案 function validatePIN pi
  • 在 flutter 中使用 image.asset 时图像质量下降

    我有一个 png 的用户 Image asset 但我注意到该图像质量较差 如何在真实设备中保持相同的质量 就我而言 问题是由于图像分辨率系统的配置错误造成的 一方面 您必须在资产文件夹中指定不同的分辨率 assets my icon pn
  • 如何在 .NET 格式字符串中转义大括号(大括号)

    使用时如何转义括号string Format 例如 String val 1 2 3 String Format foo 0 val 此示例不会引发异常 但会输出字符串foo 0 有没有办法摆脱括号 供你输出 foo 1 2 3 你必须做类
  • Rails 4.0 上的 haml-rails?

    我想知道是否有人遇到过任何障碍haml railsRails 4 0 中的 gem 有一个导轨铸件这表明存在一些问题 但没有更多提及这一点 GitHub 上托管的 gem 也没有明确提及对 Rails 4 0 的支持 那么这方面的现状如何呢
  • Android:使用SimpleCursorAdapter从数据库获取数据到ListView

    我正在编写一个 Android 应用程序 它应该使用数据库来存储数据并从中读取数据 使用本教程 在 archive org 上 我得到了创建数据库的应用程序 并且能够创建新条目 但是 我不知道如何读取数据库以获取 ListView 中存储的
  • jquery 验证 onclick

    我对 jquery 验证插件有一个问题 这对我来说没有意义 请问有人能看出我的错误在哪里吗 这是我的 HTML
  • 如何有效地将一个 Pandas Dataframe 的每一列与另一个 Dataframe 的每一列相乘?

    我正在尝试将两个 pandas 数据框相乘 具体来说 我想将每一列与另一个 df 的每一列相乘 数据帧是 one hot 编码的 所以它们看起来像这样 col 1 col 2 col 3 0 1 0 1 0 0 0 0 1 我可以使用 fo
  • 使用 axios 收到 400 错误错误请求

    我正在使用 axios 并收到 400 bad request 错误 我正在使用react redux并尝试向localhost 3000 posts发送post请求 这是我正在使用的代码 import axios from axios i
  • 如何在 Reporting Services 中以 hh:mm:ss 格式显示秒的时间跨度

    在 MS Reporting Services 2008 中 我有一个字段 该字段是以秒的形式存储的持续时间 有没有一种巧妙的方法可以在报告的组部分将其转换为 hh mm ss 格式 如果您只想显示它 请转换文本框值的表达式 Format
  • 如果十进制的范围更短,为什么它比双精度更精确? C#

    Im reading the C in a Nutshell book and it shows this table 我很难理解这张桌子 它说双重需要64 bits的空间 它的范围是10 324 to 10 308 小数取128 bits