- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是重复的,但我找不到合适的答案(问题足够接近但是..)我有一个代表十进制数的字符串,它总是有很多小数位,至少 20,有时最多 2000 (代表特定的验证计算,即像'是数字 135 到 147 素数 X 等 - 只是为了给你一些上下文)
例如:
123.829743892473218762329384241002373824970132871283923423961723816273823447623528347662123874999
我正在尝试四舍五入到倒数第二位。我建立了一个(有点)有效的小方法。但是(如上例所示)..如果最后一位数字> 4且倒数第二位数字为9,这意味着我还必须提高前一位数字,并删除最后一位0,如果-那么前一位数字也是9,这意味着我还必须提高前一位数字,依此类推。
例如
123.99999 // must become 124
123.823467283762378 // must become 123.82346728376238
123.823467283762398 // must become 123.8234672837624 (notice the last 0 has gone)
123.09999999 // must become 123.1 (notice no trailing zeros needed..)
122.00000009 // must become 122.0000001
124.81379281 // must become simply 124.8137928
129.07872345 // must become 129.0787235
129.07872344 // must become 129.0787234
等等等等。换句话说,它只是通过仅删除最后一位数字来舍入数字(这是一个字符串!!),但继续向左舍入直到不需要为止。仅在最后一个 小数 位需要舍入(如果数字是整数则不需要)并且规则是如果最后一位的数字 >4 则数字被截断并且前一个(左边)数字被保留增加 1,忽略尾随零(如果有),规则继续到整数部分的最后一位(即 123.99999 变为 124,但整数 124 保持原样等)。
有人可以帮我为此构建一个字符串扩展吗?
using System;
public class Example
{
public string round(string LargeDecimal)
{
Console.WriteLine("Number as string is: " + LargeDecimal);
int lastDigit = (int)char.GetNumericValue(LargeDecimal[LargeDecimal.Length -1]); // get last character
Console.WriteLine("lastDigit = " + lastDigit.ToString());
string number = LargeDecimal.Remove(LargeDecimal.Length - 1); // delete last character
Console.WriteLine("Now number is " + number);
if (lastDigit > 4)
{
Console.WriteLine("Last digit {0} was >4", lastDigit.ToString());
int newLastDigit = (int)char.GetNumericValue(number[number.Length -1]);
Console.WriteLine("Next to left last digit is {0} which will be raised by 1 and become {1}", newLastDigit.ToString(), (newLastDigit +1).ToString());
newLastDigit += 1; //increase by one
number = number.Remove(number.Length - 1); // delete ex-penultimate (and now last) character
number = number + newLastDigit.ToString();
return number; // and add a digit increased by 1
}
else
{
return LargeDecimal.Remove(LargeDecimal.Length - 2);
}
}
public Example()
{}
}
public class Program
{
public static void Main(string[] args)
{
string myNumber = "124.2398478278268985738276523548769";
Example myExample = new Example();
string result = myExample.round(myNumber);
Console.WriteLine("Now I have " + result);
}
}
最佳答案
嗯,这很棘手,因为有 2000 位小数,您不能使用 decimal
。所以也许有比这更简单的东西,但它可能对你有用(.NET fiddle demo):
public static string RoundLongNumber(this string input)
{
if (!ValidLongNumber(input, out bool isInteger) || isInteger) return input;
int index = input.IndexOf('.');
string part1 = input.Remove(index);
string part2 = input.Substring(index + 1);
StringBuilder sb = new StringBuilder(part2);
while(true)
{
if (LastInt() <= 4)
{
return BuildNumber();
}
sb.Length = sb.Length - 1; // remove last
int lastInt = LastInt() + 1;
while (lastInt == 10)
{
sb.Length = sb.Length - 1;
if (sb.Length == 0)
{
// just integer remaining
int num = int.Parse(part1);
return (++num).ToString();
}
lastInt = LastInt() + 1;
}
sb[sb.Length - 1] = (char)(lastInt + '0');
if (lastInt != 9) return BuildNumber();
}
int LastInt() => sb[sb.Length - 1] - '0';
string BuildNumber() => part1 + "." + sb.ToString();
}
private static bool ValidLongNumber(string number, out bool isInteger)
{
isInteger = true;
if (string.IsNullOrWhiteSpace(number)) return false;
int pointCount = 0;
foreach(char c in number)
{
bool isDigit = char.IsDigit(c);
bool isPoint = c == '.';
if (!isDigit) isInteger = false;
if (isPoint) pointCount++;
if(pointCount > 1 || (!isPoint && !isDigit)) return false;
}
return true;
}
这是您的示例:
public static void Main()
{
var strings = new List<string> {
"123.99999", // must become 124
"129.99999", // must become 130
"123.823467283762378", // must become 123.82346728376238
"123.823467283762398", // must become 123.8234672837624 (notice the last 0 has gone)
"123.09999999", // must become 123.1 (notice no trailing zeros needed..)
"122.00000009", // must become 122.0000001
"124.81379281", // must become simply 124.8137928 >>> Why? Should remain same
"129.07872345", // must become 129.0787235
"129.07872344", // must become 129.0787234 >>> Why? Should remain same
};
IEnumerable<string> results = strings.Select(s => s.RoundLongNumber());
foreach(var res in results)
{
Console.WriteLine(res);
}
}
请注意,这两个结果是不同的,但要么您没有解释该规则,要么您的期望是错误的:
124.81379281 // must become simply 124.8137928
129.07872344 // must become 129.0787234
为什么?据我了解,两者应该保持不变。
关于C# 十进制(字符串类型)在最后一个字符处四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70901656/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!