相关疑难解决方法(0)

为什么.NET使用银行家的舍入作为默认值?

根据文档,该decimal.Round方法使用round-to-even算法,这对于大多数应用程序来说并不常见.所以我总是最终编写一个自定义函数来做更自然的圆半算法:

public static decimal RoundHalfUp(this decimal d, int decimals)
{
    if (decimals < 0)
    {
        throw new ArgumentException("The decimals must be non-negative", 
            "decimals");
    }

    decimal multiplier = (decimal)Math.Pow(10, decimals);
    decimal number = d * multiplier;

    if (decimal.Truncate(number) < number)
    {
        number += 0.5m;
    }
    return decimal.Round(number) / multiplier;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道这个框架设计决策背后的原因?

是否有任何内置的圆形半算法实现到框架中?或者可能是一些非托管Windows API?

对于初学者而言,这可能会产生误导,因为他们只是写了一个decimal.Round(2.5m, 0)期望3但结果是2.

.net rounding

264
推荐指数
4
解决办法
5万
查看次数

System.Convert.ToInt vs(int)

我在另一篇文章中注意到有人做了类似的事情:

double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));
Run Code Online (Sandbox Code Playgroud)

他们为什么使用转换函数,而不是:

double d = 3.1415;
int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

它有一个隐含的底层和转换.

另外,更关注的是,我在一些生产代码中注意到我正在阅读:

double d = 3.1415;
float f = Convert.ToSingle(d);
Run Code Online (Sandbox Code Playgroud)

这是一样的:

float f = (float)d;
Run Code Online (Sandbox Code Playgroud)

是否所有这些隐式转换只是在Convert类中是为了完整性,还是它们是否有用?我可以理解需要.ToString(),但不是其他的.

c# types

12
推荐指数
1
解决办法
7409
查看次数

为何选择Convert.ToInt32(1.0/0.00004)!=(Int32)(1.0/0.00004)

为什么这个代码 http://ideone.com/YRcICG

void Main()
{   
    double a = 0.00004;
    Int32 castToInt = (Int32)(1.0/a);
    Int32 convertToInt = Convert.ToInt32(1.0/a);

    Console.WriteLine("{0} {1:F9} {2:F9}", castToInt == convertToInt, castToInt, convertToInt);

    Console.WriteLine((((int)(1.0/(1.0/25000))) == 24999));
}
Run Code Online (Sandbox Code Playgroud)

结果是

错24999,000000000 25000,000000000

在CLR/C#实现的上下文中

c# math clr casting .net-4.0

2
推荐指数
1
解决办法
294
查看次数

将float转换为整数时出现.NET错误?

看看它:这个小的.NET控制台程序会产生有趣的结果......请注意我是如何以两种不同的方式将浮点数转换为整数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CastVsConvert
{
    class Program
    {
        static void Main(string[] args)
        {
            int newWidth = 0;
            CalculateResizeSizes(600, 500, out newWidth);
        }

        static void CalculateResizeSizes(int originalWidth, int maxWidth, out int newWidth)
        {
            float percentage = 1.0F;
            percentage = maxWidth / (float)originalWidth;

            newWidth = (int)((float)originalWidth * percentage);
            int newWidthConvert = Convert.ToInt32((float)originalWidth * percentage);

            Console.Write("Percentage: {0}\n", percentage.ToString());
            Console.Write("Cast: {0}\n", newWidth.ToString());
            Console.Write("Convert: {0}\n", newWidthConvert.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望"Cast"和"Convert"的输出相同,但它们不是......这是输出:

C:\Documents and Settings\Scott\My Documents\Visual Studio 2008\Projects\CastVsC
onvert\CastVsConvert\bin\Debug>CastVsConvert.exe
Percentage: …
Run Code Online (Sandbox Code Playgroud)

.net floating-point

1
推荐指数
3
解决办法
2102
查看次数

如何正确使用Math.Pow()?

我想找到方程的所有正整数解, a^3 + b^3 = c^3 + d^3其中a,b,c,d是1到1000之间的整数;

for (int a = 1; a <= 1000; ++a)
{
    for (int b = 1; b <= 1000; ++b)
    {
        for (int c = 1; c <= 1000; ++c)
        {
            for (int d = 1; d <= 1000; ++d)
            {
                if (Math.Pow(a, 3) + Math.Pow(b, 3) == Math.Pow(c, 3) + Math.Pow(d, 3))
                {
                     Console.WriteLine("{0} {1} {2} {3}", a,b,c,d);
                }
            }
      }
}
Run Code Online (Sandbox Code Playgroud)

我知道d = Math.Pow(a^3 + b^3 - c^3, 1/3) …

c# algorithm

-1
推荐指数
1
解决办法
630
查看次数

标签 统计

c# ×3

.net ×2

.net-4.0 ×1

algorithm ×1

casting ×1

clr ×1

floating-point ×1

math ×1

rounding ×1

types ×1