从double获取小数部分

use*_*549 70 .net c#

我希望以整数形式接收小数点后面的数字.例如,从1.05只有05或从2.50只有50 而不是 0.50

mat*_*rai 174

最好的方法是:

var floatNumber = 12.5523;

var x = floatNumber - Math.Truncate(floatNumber);
Run Code Online (Sandbox Code Playgroud)

结果你可以转换,但你喜欢

  • 我认为这个解决方案有一个"问题".如果floatNumber为"10.2",则变量x将类似于"0.19999999999999929".即使这按预期工作,结果将是"0.2"而不是"2". (19认同)
  • 这应该是一个公认的答案,一个数学问题的数学解决方案,没有在字符串操作中的所有繁琐的麻烦 (9认同)
  • @Dherik Float和Double值在最后几位小数位的减法下总是有小错误.你不应该认为那些是重要的.如果您确实需要这种精度,则应使用Decimal类型.如果你不能切换到十进制(或者只是不想),那么你应该以某种方式跟踪预期的精度,并在比较操作中考虑到这一点.我通常使用4位小数,但可能有例外. (4认同)

tme*_*ser 73

var decPlaces = (int)(((decimal)number % 1) * 100);
Run Code Online (Sandbox Code Playgroud)

这假设您的号码只有两位小数.


ora*_*rad 14

没有舍入问题的解决方案:

double number = 10.20;
var first2DecimalPlaces = (int)(((decimal)number % 1) * 100);
Console.Write("{0:00}", first2DecimalPlaces);
Run Code Online (Sandbox Code Playgroud)

输出: 20

请注意,如果我们没有强制转换为十进制,则会输出19.

也:

  • 对于318.40输出:40(代替39)
  • 对于47.612345输出:61(代替612345)
  • 对于3.01输出:01(代替1)

如果您正在使用财务数字,例如,如果在这种情况下您尝试获取交易金额的美分部分,请始终使用decimal数据类型.

更新:

如果将其作为字符串处理(以@ SearchForKnowledge的答案为基础),以下内容也适用.

10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1]
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Int32.Parse它将其转换为int.


小智 14

与'Math.Truncate'方法相比,有一种更清洁,更快速的解决方案:

double frac = value % 1;
Run Code Online (Sandbox Code Playgroud)

  • 注意:**对于负值,它是负**:-12.34%1 => -0.33999999999999986 (2认同)

小智 10

最简单的变体可能是Math.truncate()

double value = 1.761
double decPart = value - Math.truncate(value)
Run Code Online (Sandbox Code Playgroud)


Par*_*ram 9

更好的方法 -

        double value = 10.567;
        int result = (int)((value - (int)value) * 100);
        Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

输出 -

56
Run Code Online (Sandbox Code Playgroud)

  • 没有测试,但是这会遇到浮动错误,不是吗? (2认同)