2012-05-24 75 views
7

解決我得出了一些有趣的發現一個錯誤。C#錯誤操作員%

這個過程的結果

static void Main(string[] args) 
    { 
     int i4 = 4; 
     Console.WriteLine("int i4 = 4;"); 
     Console.WriteLine("i4 % 1 = {0}", i4 % 1); 

     double d4 = 4.0; 
     Console.WriteLine("double d4 = 4.0;"); 
     Console.WriteLine("d4 % 1 = {0}", d4 % 1); 
     Console.WriteLine("-----------------------------------------------------------"); 
     int i64 = 64; 
     double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0); 
     Console.WriteLine("int i64 = 64;"); 
     Console.WriteLine("double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0) = {0}", dCubeRootOf64); 
     Console.WriteLine("dCubeRootOf64 = {0}", dCubeRootOf64); 
     Console.WriteLine("dCubeRootOf64 % 1 = {0} ?????????????? Why 1. ??????????", dCubeRootOf64 % 1); 

     Console.ReadLine(); 
    } 

int i4 = 4; 
i4 % 1 = 0 
double d4 = 4.0; 
d4 % 1 = 0 
----------------------------------------------------------- 
int i64 = 64; 
double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0) = 4 
dCubeRootOf64 = 4 
dCubeRootOf64 % 1 = 1 ?????????????? Why 1. ?????????? 

int 4 % 1 = 0 - 正確

double 4.0 % 1 = 0 - 正確

但缺陷是:

Math.Pow(64,1.0/3.0)%1 = 1

立方根是4.爲什麼在這種情況下4 % 1 = 1

+0

退房谷歌:(64 ^(1/3))MOD 1 – SQLMason

+0

如果你想確保這是一個你得到模數的整數,試着去模擬它。 – SQLMason

+0

您正在尋找這個我覺得 http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float-and-double-in-c – Nevyn

回答

12

Math.Pow(64, 1.0/3.0)回報3.9999999999999996
顯示時,它會舍入到4

以模1爲單位返回0.99999999999999956,在顯示時類似地舍入爲1

您可以通過添加.ToString("R")

+0

以後就不會其餘從模運算符返回的是像.99999999或0.0000001取決於'Math.Pow的精確值(64 ...等)',而不是價值1? –

+0

謝謝,Math.Pow(64,1.0/3.0)返回3.9999999999999996。 - 這解釋了一切 – SelvirK

3

dCubeRootOf64 % 1 = 1回報一睹真值1,而不是0;導致Math.Pow(i64, 1.0/3.0)回報3.99999999999999963.9999999999999996 % 1返回0.99999999999999956這反過來又得到四捨五入到1

這樣的結果爲1

+1

這裏一定有一些愚蠢的事情發生。它不應該返回1. 1進入64 64次,所以結果應該是0. –

+0

@GrantWinney:的確如此。 '4.0%1'返回'0'。 – SLaks

+0

我只是嘗試了相同的發佈代碼,它在3.5框架中給出了1作爲o/p。 – Rahul