加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#检查小数点是否小于3位?

发布时间:2020-12-15 07:38:47 所属栏目:百科 来源:网络整理
导读:我有一个我不能改变的情况:一个数据库表(表A)接受6位小数,而不同表(表B)中的相关列只有3位小数. 我需要从A复制到B,但如果A有小于3位的小数位,额外的数据就会丢失.我不能更改表定义,但我可以添加一个解决方法.所以我试图找出如何检查一个十进制数小数位数是
我有一个我不能改变的情况:一个数据库表(表A)接受6位小数,而不同表(表B)中的相关列只有3位小数.

我需要从A复制到B,但如果A有小于3位的小数位,额外的数据就会丢失.我不能更改表定义,但我可以添加一个解决方法.所以我试图找出如何检查一个十进制数小数位数是否超过3位?

例如

Table A
Id,Qty,Unit(=6dp)
1,1,0.00025
2,4000,0.00025

Table B
Id,TotalQty(=3dp)

我想能够找出表A中的数量*单位是否超过3个小数(第1行将失败,第2行将通过):

if (CountDecimalPlaces(tableA.Qty * tableA.Unit) > 3)
{
    return false;
}
tableB.TotalQty = tableA.Qty * tableA.Unit;

我将如何实现CountDecimalPlaces(十进制值){}函数?

解决方法

它适用于3位小数,它可以适用于通用解决方案:
static bool LessThan3DecimalPlaces(decimal dec)
{
    decimal value = dec * 1000;
    return value == Math.Floor(value);
}
static void Test()
{
    Console.WriteLine(LessThan3DecimalPlaces(1m * 0.00025m));
    Console.WriteLine(LessThan3DecimalPlaces(4000m * 0.00025m));
}

对于一个真正的通用解决方案,您需要在其部分中“解构”十进制值 – 有关更多信息,请查看Decimal.GetBits.

更新:这是一个通用解决方案的简单实现,该解决方案适用于整数部分小于long.MaxValue的所有小数(您需要类似“大整数”的trully通用函数).

static decimal CountDecimalPlaces(decimal dec)
{
    int[] bits = Decimal.GetBits(dec);
    int exponent = bits[3] >> 16;
    int result = exponent;
    long lowDecimal = bits[0] | (bits[1] >> 8);
    while ((lowDecimal % 10) == 0)
    {
        result--;
        lowDecimal /= 10;
    }

    return result;
}
static void Foo()
{
    Console.WriteLine(CountDecimalPlaces(1.6m));
    Console.WriteLine(CountDecimalPlaces(1.600m));
    Console.WriteLine(CountDecimalPlaces(decimal.MaxValue));
    Console.WriteLine(CountDecimalPlaces(1m * 0.00025m));
    Console.WriteLine(CountDecimalPlaces(4000m * 0.00025m));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读