Tag: 十进制

C#将字符串转换为double / decimal并返回字符串,保留尾随零,为数千添加coma

我试图获取用户输入,解析它然后用String.Format()显示,用comas格式化数千。 So, if user provides 1000 I will display 1,000 1000.00 => 1,000.00 1000.0 => 1,000.0 1,000.5 => 1,000.5 基本上我想保留所提供的所有小数(包括尾随零),只需添加数千的格式。 我试过了: String.Format(“{0:#,0.######}” , Decimal.Parse(input)); String.Format(“{0:#,0.######}” , Double.Parse(input);

为什么Convert.ToDecimal(Double)轮到15位有效数字?

我有一个小数点后的17位数的double ,即: double myDouble = 0.12345678901234567; 如果我将此转换为decimal如下所示: decimal myDecimal = Convert.ToDecimal(myDouble); 然后myDecimal的值根据Convert.ToDecimal文档舍入为15位数(即0.0123456789012345 )。 我的问题是,为什么要进行这种舍入? 我明白,如果我的原始数字可以在10号基础上准确表示,并且我试图将其存储为double ,那么我们只能对前15位数有信心。 最后两位数将受到舍入误差的影响。 但是,这是一个基础10偏见的观点。 我的数字可能更准确地用double精度表示,我希望将其转换为decimal同时尽可能保持准确性。 不应该Convert.ToDecimal旨在最小化myDouble和(double)Convert.ToDecimal(myDouble)之间的差异?

如何处理大多数小数部分无法用二进制精确表示的事实?

因此,我们知道诸如0.1之类的分数无法在二进制基数中准确表示,这会导致精确的问题(例如此处提到的: 格式化C#中输出的双精度数 )。 我们知道数字的十进制表示有十进制类型…但问题是,很多数学方法,不支持十进制类型,所以我们将它们转换为double,这再次破坏了数字。 那我们该怎么办?

C#:存储百分比,50还是0.50?

当在变量中保持百分比值时,将它们保持为整数与分数之间存在偏好。 那应该是变量是否保持0到100之间或0.00到1.00之间的数字? 在任何一种情况下,保存值的变量都是十进制类型。 我正在与之交互的数据库恰好将它们存储为0到100的整数。 注意:我使用“整数”这个词来表示0到100范围内的值,尽管这些值可能包含小数分量(例如,25.75)。 我不知道如何描述两个百分比值范围之间的差异

使用逗号格式化十进制,保留尾随零

我想将小数转换为字符串,逗号为数千个分隔符,并保留创建小数的相同精度。 (将有2-5位有关数字) decimal d = 1234.4500M; //I’d like “1,234.4500” var notRight = d.ToString(“###,###.#######”); //1,234.45 var alsoNotRight = d.ToString(“###,###.00000”);; //1,234.45000 var notRightEither = d.ToString(“N”); //1,234.45 var notRightEither2 = d.ToString(“G”); //1234.45000 如果不手动解析字符串,是否没有内置方法可以做到这一点? 如果没有单一格式字符串,最简单的方法是什么?

按键事件后十进制后的限制数字

我使用以下代码只从用户获取数字,只有一个小数点,这对我在KeyPress事件上工作正常: if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != ‘.’) { e.Handled = true; } if (e.KeyChar == ‘.’ && (sender as TextBox).Text.IndexOf(‘.’) > -1) { e.Handled = true; } 现在我想限制小数点后面的数字/数字,即35.25468,表示点/小数后只需要6个数字/位数。 告诉我 !

如何从十进制字符串中删除零和小数点?

以下代码目前输出: 12.1 12.100 12.1000 12.00 12 12.0000 如何更改它以便输出: 12.1 12.1 12.1 12 12 12 Math.Round似乎是事情,但它让我定义了我想要的小数位数,但我希望它们如上所述可变。 如果没有数学方法可以做到这一点,我只会从字符串的右侧去掉零和小数点,但会认为有一种数学方法来处理它。 using System; using System.Collections.Generic; namespace Test8834234 { public class Program { static void Main(string[] args) { List decimalsAsStrings = new List { “12.1”, “12.100”, “12.1000”, “12.00”, “12”, “12.0000” }; foreach (var decimalAsString in decimalsAsStrings) { decimal dec = decimal.Parse(decimalAsString); […]

为什么Decimal.MaxValue – 0.5的结果是整数?

我今天正在玩小数。 我注意到了这个: Decimal.MaxValue 79228162514264337593543950335 Decimal.MaxValue – 0.5m 79228162514264337593543950334 以下代码打印为true。 static void Main(string[] args) { decimal d = Decimal.MaxValue – 0.5M; var b = d % 1 == 0; Console.WriteLine(b); } 我确信这背后有一个原因,但我不知道它是什么。

在幕后,C#/ .NET中十进制值类型发生了什么?

如何实现decimal类型? 更新 它是128位值类型(16字节) 1个符号位 尾数为96位(12字节) 指数为8位 剩余的比特(其中23个!)设置为0 谢谢! 我会坚持使用我自己的隐含比例的64位长。

有效地将字节数组转换为Decimal

如果我有一个字节数组,并希望将该数组的连续16字节块(包含.net的Decimal表示forms)转换为适当的Decimal结构,那么最有效的方法是什么? 在我正在优化的案例中,这些代码在我的分析器中显示为最大的CPU消费者。 public static decimal ByteArrayToDecimal(byte[] src, int offset) { using (MemoryStream stream = new MemoryStream(src)) { stream.Position = offset; using (BinaryReader reader = new BinaryReader(stream)) return reader.ReadDecimal(); } } 为了摆脱MemoryStream和BinaryReader ,我认为将一个BitConverter.ToInt32(src, offset + x)的数组提供给Decimal(Int32[])构造函数会比我下面给出的解决方案更快,但下面的版本是,奇怪的是,速度快了两倍。 const byte DecimalSignBit = 128; public static decimal ByteArrayToDecimal(byte[] src, int offset) { return new decimal( BitConverter.ToInt32(src, offset), BitConverter.ToInt32(src, offset […]