你怎么能将任何数字(不只是整数> 0)舍入到N位有效数字?
例如,如果我想要舍入到三位有效数字,我正在寻找一个可以采用的公式:
1,239,451并返回1,240,000
12.1257并返回12.1
.0681并返回.0681
5并返回5
当然,算法不应该被硬编码为仅处理3的N,尽管这将是一个开始.
如果我有一个双(234.004223)等,我想将其舍入为C#中的x位有效数字.
到目前为止,我只能找到舍入到x小数位的方法,但如果数字中有任何0,则只会删除精度.
例如,0.086到一位小数位变为0.1,但我希望它保持在0.08.
我正在进行高精度的科学计算.在寻找各种效果的最佳表示时,我不断提出想要获得下一个更高(或更低)双精度数的理由.基本上,我想要做的是在double的内部表示中添加一个最低有效位.
难点在于IEEE格式不完全一致.如果要使用低级代码并实际将一个代码添加到最低有效位,则生成的格式可能不是下一个可用的双精度型.例如,它可能是一个特殊的案例编号,例如PositiveInfinity或NaN.还有一些次正常值,我不认为这些值,但它们似乎具有与"正常"模式不同的特定位模式.
可以使用"epsilon"值,但我从未理解其定义.由于double值不是均匀间隔,因此不能将单个值添加到double以产生下一个更高的值.
我真的不明白为什么IEEE没有指定一个函数来获得下一个更高或更低的值.我不可能是唯一需要它的人.
有没有办法获得下一个值(没有某种类型的循环尝试添加更小和更小的值).
所以我决定尝试通过编写一些python脚本来解决我的物理作业来为我解决问题.我遇到的一个问题是,重要的数字似乎并不总能正常出现.例如,它可以正确处理重要数字:
from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")
Run Code Online (Sandbox Code Playgroud)
但这不是:
>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")
Run Code Online (Sandbox Code Playgroud)
所以有两个问题:
我使用以下代码来显示使用String.Format的百分比,但我也想将有效数字的数量限制为2,这两个似乎并不能很好地结合在一起.我怎样才能使两者正常合作?
String.Format("% Length <= 0.5: {0:0%}", m_SelectedReport.m_QLT_1);
Run Code Online (Sandbox Code Playgroud)
所以我理想的是这样的东西
double d1 = 1234;
double d2 = 0.1234;
//Output of d1 -> 12
//Output of d2 -> 0.12
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建图形轴标签 - 物理文本.我知道如何获取标签并使用GDI打印它们,但我的算法不能很好地使用小数步骤进行打印.
要打印标签,我目前获得第一个标签,然后为每个标签添加一个步骤:
public static void PrintLabels(double start, double end, double step);
{
double current = start;
while (current <= end)
{
gfx.DrawString(current.ToString(),...);
current += step;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有number.ToString("something")将打印出小数,如果他们在那里,否则只是整体的一部分?我首先检查开始,结束或步骤是否包含小数部分,然后如果是,则打印所有带小数的标签.
我有一个System.Decimal号码
0.00123456789
我希望得出3位重要数字.我预计
0.00123
行为是舍入行为而不是截断.在.Net中是否有防弹方法可以做到这一点?
也许我的措辞不太清楚,所以我尝试举例说明:
当然,我可以使用 switch/case 语句来做到这一点,但我想知道是否有任何内置或实用程序格式,什么可以开箱即用地做到这一点。
提前致谢