Tag: 浮点

将浮点数显示为文本框类型“数字”

关于将文本框字符串转换为浮点值或允许类型=“数字”的文本框允许小数点有很多问题,但是,我似乎无法找到与显示浮点值相关的任何内容一个文本框,其类型设置为“数字”。 到目前为止,我所拥有的是一个text = type =“number”和step =“0.01”。 它的最小值为“0”。 它显示如下: 它适用于用户输入并将数据保存到可变数据库/数据库而没有任何问题。 但是,如果我想将相同的值显示给用户,则它不显示任何内容,甚至不显示“0”。 所以我的问题是:如何将值格式化为“浮点数”,将其转换为“字符串”,并将其应用于Textbox.Text,以便显示值? 举个例子:如果我将文本框中的值设置为“5”,它将保存并显示“5”,但是如果我放“5.5”或“5,5”,无论哪种方式,它都不会显示它,而我需要它显示“5.5”。 有任何想法吗? PS:它应该代表货币价值。 如果可能的话,我也希望有一个不需要Javascript的解决方案。

MemoryStream来自bytes数组,具有不同类型的数据

我想创建一个包含int32,int16,单值的内存流。 使用二进制文件是没用的,所以我试图创建字节数组。 因为值是不同的类型,我不知道如何正确地做到这一点。 所以我尝试这样做: byte[] tab = new byte[]{2,0,0,0,3,0,3,0} – 2是int32(四个字节),另外两个3是int16(两个字节) 这工作正常,但是当我想添加一些单个值时,它会产生错误。 我不能这样做: byte[] tab = new byte[]{2,0,0,0,3,0,3,0,4.4f,5.6f} 我必须有正确格式的流,因为这个流将在这个方法中读取: short[] rawData; float[] modulusData; public void rawData(Stream s) { BinaryReader br = new BinaryReader(s); int dataCount = br.ReadInt32(); if (dataCount > 0) { rawData = new short[dataCount]; for (int i = 0; i 0) { modulusData […]

C#输入文本框的validation:float

这个简单的任务给我带来了一些麻烦。 我只想让用户输入任何成功的float.TryParse文本到Textboxish控件中。 我可以使用普通的TextBox并检查一些btnOK_Click中的Text,但这显然很蹩脚。 此外,有一个很好的内置MaskedTextBox控件,但我没有设置它的掩码等于float.TryParse 。 此外,它似乎仅在发生焦点变化时检查有效性。 在网上挖掘带来了一些有趣的想法,但没有一个像我想的那样好。 你是怎么解决这个问题的? 我只是错过了一个明显的解决方案,还是我必须自己实现这个function? 我知道SO上有一些类似的线程,但没有找到可行的解决方案。 更新:是的,WinForms。

将float转换为UInt32 – 哪个表达式更精确

我有一个float x ,它应该在范围内,但它经过几次数值运算 – 结果可能略微超出。 我需要使用整个UInt32范围将此结果转换为uint y 。 当然,我需要在范围内钳制x并进行缩放。 但是哪种操作顺序更好? y = (uint)round(min(max(x, 0.0F), 1.0F) * UInt32.MaxValue) 要么 y = (uint)round(min(max(x * UInt32.MaxValue, 0.0F), UInt32.MaxValue) 换句话说,最好先缩放,然后钳制OR钳位然后缩放? 我在IEEE浮点表示中不是很深刻,但我相信上述表达式的计算顺序有所不同。

将float和double值与delta进行比较?

据我所知,必须仔细比较浮点类型的值,以避免固有浮点错误的问题。 这可以通过将值与错误阈值进行比较来改进。 例如,以下解决方案比简单的x == y测试更有用: static float CompareRelativeError(float x, float y) { return Math.Abs(x – y) / Math.Max(Math.Abs(x), Math.Abs(y)); } static bool CompareAlmostEqual(float x, float y, float delta) { return x == y || CompareRelativeError(x, y) < delta; } // apologies if this is a poor example if (CompareAlmostEqual(1f/10f, 0.1f)) { … } 上面的解决方案来自以下资源: 在Java中直接比较2 […]

Math.Cos()的精度为大整数

我正在尝试在C#中计算4203708359弧度的余弦: var x = (double)4203708359; var c = Math.Cos(x); (4203708359可以用双精度精确表示。) 我越来越 c = -0.57977754519440394 Windows的计算器给出了 c = -0.579777545198813380788467070278 PHP的cos(double)函数(在内部只使用C标准库中的cos(double) )给出: c = -0.57977754519881 在使用Visual Studio 2017编译的简单C程序中,C的cos(double)函数给出了 c = -0.57977754519881342 以下是C#中Math.cos()的定义: https : //github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Math.cs#L57-L58 它似乎是一个内置function。 我没有在C#编译器中挖掘(还)来检查这有效编译的内容,但这可能是下一步。 同时: 为什么我的C#示例中的精度如此差,我该怎么办呢? 仅仅是C#编译器中的余弦实现对大整数输入的影响很小吗? 编辑1:Wolfram Mathematica 11.0: In[1] := N[Cos[4203708359], 50] Out[1] := -0.57977754519881338078846707027800171954257546099993 编辑2:我确实需要那个级别的精度,而且我已经准备好了很长时间才能获得它。 如果存在一个支持余弦的好的库,我会很乐意使用一个任意的精度库(到目前为止我的努力还没有让一个)。 编辑3:我在coreclr的问题跟踪器上发布了这个问题: https : //github.com/dotnet/coreclr/issues/12737

浮动可以通过双倍往返而不会丢失精度吗?

如果我有一个C# float ,我可以将它转换为double而不会丢失任何精度吗? 如果该double转换回float ,它是否具有完全相同的值?

“For”循环增量无法正常工作。 为什么?

for (float i = -1; i <= 1; i+=0.1f) { Console.WriteLine(i); } 这是结果 -1 -0.9 -0.8 -0.6999999 -0.5999999 -0.4999999 -0.3999999 -0.2999999 -0.1999999 -0.09999993 7.450581E-08 0.1000001 0.2000001 0.3000001 0.4000001 0.5000001 0.6000001 0.7000001 0.8000001 0.9000002

C#浮动无限循环

C#(。Net 3.5 SP1)中的以下代码是我机器上的无限循环: for (float i = 0; i < float.MaxValue; i++) ; 它达到了16777216.0和16777216.0 + 1的评估值为16777216.0。 但在这一点上:我+ 1!=我。 这是一些疯狂。 我意识到浮点数的存储方式存在一些不准确之处。 而且我已经读过整数大于2 ^ 24但不能正确存储为浮点数。 上面的代码仍然应该在C#中有效,即使数字无法正确表示。 为什么不起作用? 你可以在double中获得同样的效果,但这需要很长时间。 9007199254740992.0是double的限制。

当我将双倍与零比较时,为什么Resharper会抱怨?

如果我做 double d = 0; if (d == 0) { … } Resharper在比较d == 0抱怨“浮点数与相等运算符的比较。在舍入值时可能会损失精度。” 为什么? 将双精度值或浮点数表示为精确零值并不困难吗? 我理解,如果我将一些其他值(例如0.2)与没有确切的二进制表示forms进行比较,那么这样的警告是相关的。