计算系统.小数精度和小数位数

2024-01-17

假设我们有一个 System.Decimal 数字。

为了便于说明,我们以 ToString() 表示如下:

d.ToString() = "123.4500"

关于这个 Decimal 可以说如下。出于我们的目的,比例被定义为小数点右侧的位数。有效标度类似,但忽略小数部分中出现的任何尾随零。 (换句话说,这些参数的定义类似于 SQL 小数加上一些附加参数来解释小数部分尾随零的 System.Decimal 概念。)

  • 精度:7
  • 规模:4
  • 有效精度:5
  • 有效规模:2

给定一个任意的 System.Decimal,如何有效地计算所有这四个参数,而不需要转换为字符串并检查字符串?该解决方案可能需要 Decimal.GetBits。

更多示例:

Examples Precision  Scale  EffectivePrecision  EffectiveScale
0        1 (?)      0      1 (?)               0
0.0      2 (?)      1      1 (?)               0
12.45    4          2      4                   2
12.4500  6          4      4                   2
770      3          0      3                   0

(?) 或者将这些精度解释为零也可以。


是的,你需要使用Decimal.GetBits。不幸的是,您必须使用 96 位整数,并且 .NET 中没有可以处理 96 位的简单整数类型。另一方面,您可以使用Decimal本身...

下面是一些代码,它产生与您的示例相同的数字。希望你觉得它有用 :)

using System;

public class Test
{
    static public void Main(string[] x)
    {
        ShowInfo(123.4500m);
        ShowInfo(0m);
        ShowInfo(0.0m);
        ShowInfo(12.45m);
        ShowInfo(12.4500m);
        ShowInfo(770m);
    }

    static void ShowInfo(decimal dec)
    {
        // We want the integer parts as uint
        // C# doesn't permit int[] to uint[] conversion,
        // but .NET does. This is somewhat evil...
        uint[] bits = (uint[])(object)decimal.GetBits(dec);


        decimal mantissa = 
            (bits[2] * 4294967296m * 4294967296m) +
            (bits[1] * 4294967296m) +
            bits[0];

        uint scale = (bits[3] >> 16) & 31;

        // Precision: number of times we can divide
        // by 10 before we get to 0        
        uint precision = 0;
        if (dec != 0m)
        {
            for (decimal tmp = mantissa; tmp >= 1; tmp /= 10)
            {
                precision++;
            }
        }
        else
        {
            // Handle zero differently. It's odd.
            precision = scale + 1;
        }

        uint trailingZeros = 0;
        for (decimal tmp = mantissa;
             tmp % 10m == 0 && trailingZeros < scale;
             tmp /= 10)
        {
            trailingZeros++;
        }

        Console.WriteLine("Example: {0}", dec);
        Console.WriteLine("Precision: {0}", precision);
        Console.WriteLine("Scale: {0}", scale);
        Console.WriteLine("EffectivePrecision: {0}",
                          precision - trailingZeros);
        Console.WriteLine("EffectiveScale: {0}", scale - trailingZeros);
        Console.WriteLine();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算系统.小数精度和小数位数 的相关文章

  • Visual Studio '17 未在参考管理器中显示程序集

    我遇到的问题是 我似乎无法弄清楚如何添加对某些解决方案的引用 在我从 Visual Studio 17 开始的大多数解决方案中 我在解决方案资源管理器中看到 引用 但例如对于 asp net core web api 我得到 依赖项 每当解
  • 将 matplotlib 绘图中的小数点更改为逗号

    我在 Debian 上使用 python 2 7 13 和 matplotlib 2 0 0 我想将 matplotlib 绘图中轴和注释上的小数点标记更改为逗号 然而解决方案发布here https stackoverflow com q
  • 如何在嵌套列表视图中编辑数据

    我使用列表视图来显示项目列表 并使用嵌套列表视图来显示每个项目的功能列表 父列表视图和子列表视图都需要能够进行插入 编辑和删除操作 它适用于父列表视图 但是 当我尝试编辑子项目时 编辑按钮不会将其带入编辑模式 您能建议我代码中缺少什么吗
  • 如何使用 StreamWriter 写入文件?

    在我的 Wpf 应用程序中 我使用一个 Person 类 即基类 它包含一个虚拟方法 SaveData 以及从 Person 继承的其他类 Client 如何重写方法 SaveData 并保留基础数据 类人 public virtual v
  • 按字母顺序对列表进行排序

    我有以下课程 class Detail public Detail details new List
  • Windows 窗体中的提示对话框

    我在用System Windows Forms但奇怪的是没有能力创造它们 如何在没有 javascript 的情况下获得类似 javascript 提示对话框的内容 MessageBox 很好 但是用户无法输入内容 我希望用户输入任何可能的
  • 实体框架:数据库上下文可以在不同模式之间拥有外键吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个具有多个模式的数据库 公司架构师希望每个架构都有实体框架 DbContext 此外 不同模式之间还存在外键关系 今天在搭建架
  • 在 ViewModel 中使用 CollectionViewSource 的正确方法

    我使用拖放将数据源对象 数据库模型 绑定到DataGrid 基本上遵循这个例子实体框架与 WPF 的数据绑定 http msdn microsoft com en us data jj574514 通过这个实现 一切都运行良好 XAML
  • Global.asax 和 Error.aspx 中的 ASP.NET MVC 错误日志记录

    我正在创建一个 ASP NET MVC 应用程序 我需要在两个地方处理异常 Global asax vb 文件 Public Class MvcApplication Inherits System Web HttpApplication
  • 如何从 DataGridView 数据单元格获取按键、按键事件

    我需要在单元格编辑期间接收按键事件DataGridView控制 从我在网上查到的DataGridView旨在传递所有关键事件DataGridView到单元格编辑控件 您无法轻松获取这些事件 我找到了这个一段代码 http www codep
  • .NET:SqlDataReader.Close 或 .Dispose 导致超时过期异常

    当尝试在 SqlDataReader 上调用 Close 或 Dispose 时 我收到超时过期异常 如果您有到 SQL Server 的 DbConnection 您可以使用以下命令自行重现它 String CRLF r n String
  • 运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?

    我试图将我的表单精确定位在任务栏上方 不幸的是 我的努力受到了以下事实的阻碍 this Height在我的表单上返回一个比实际表单 包含所有边框 标题栏等 小 10 像素的值 我正在运行带 Aero 的 Windows 7 当 Aero 关
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • .NET ServiceModel.Syndicate - 更改 RSS 源的编码

    我正在尝试解决我在以下位置生成的所有 RSS 源的错误http captainobvio us http captainobvio us在 Internet Explorer 版本 8 和 9 中产生以下错误 进给代码错误 从当前切换 编码
  • 使用“new()”和“.StartNew()”创建新实例有什么区别?

    来自我对问题的 回答 任务中的秒表似乎在所有任务中都是累加的 只想测量任务间隔 https stackoverflow com a 16259019 200449 创建新的项目之间可能存在哪些差异跑表 http msdn microsoft
  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • ASP.NET MVC - 临时要求除一页之外的整个站点授权的简单方法

    我正在建立一个混合了公共页面和会员专用页面的网站 登录系统按原样工作正常 不过 我想启动一个封闭的 仅限邀请的预览 并暂时要求访问者登录才能执行除欢迎页面之外的所有操作 目前我有 Authorize 某些操作方法的属性 我也可以向其他操作方
  • 更改实体的可访问性

    我想建立一个内部实体 我已将实体 其标量属性和导航属性更改为内部 当我尝试构建它时出现此错误 错误 6036 EntityType 文件 具有 内部 可访问性 EntitySet 文件 具有具有 公共 可访问性的 get 属性 Entity
  • 检查 SSRS 报告自定义代码中的 Active Directory 组成员资格表单

    我正在构建 SQL Server Reporting Services SSRS 报告 查看报告的最终用户可以选择某些输入参数 在本例中为位置 用户可以选择的位置取决于 Active Directory 组成员身份 因此我尝试在自定义报告功
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute

随机推荐