2013-02-17 115 views
1

如何在C#中将两个64位十进制数相乘而不会溢出?两个64位数的乘法运算

+0

我不认为你可以存储一个64位数字在任何现代的CPU完全准确,假设你的意思是十进制数字,而不是二进制数字或别的东西。如果您有两个64位数字(假设从非零开始),那么结果将是大约128位数字(10^64 * 10^64 = 10^128)。哎哟。 – Joe 2013-02-17 10:30:48

+1

你应该给出比这更多的信息。他们是整数吗?这非常重要。数字在什么基础上?二进制?十进制?十六进制也许?它很重要。 – harold 2013-02-17 10:32:50

+0

对不起,缺失的信息...两个号码。是小数点 – Bright 2013-02-17 10:38:12

回答

3

如果需要64个十进制位数字,如果他们是整数,则可以使用System.Numerics.BigInteger结构(需要​​集的引用)。

BigInteger firstNumber = BigInteger.Parse("63518439492097324687235465876298368764576527346564625480"); 
BigInteger secondNumber = BigInteger.Parse("84890247648975285765484902890273086475254764765147643611"); 
BigInteger product = firstNumber * secondNumber; 
+0

不错。我正在猜测的一个类实现了我要建议的内容(将数字分成易于管理的数字,并在部分中进行乘法运算) – Joe 2013-02-17 10:34:34

+1

@Joe是的,它将它分解为无符号的8位数字。它们被保存在一个'byte []'类型的数组中。我不知道给定大小的BigInteger需要多少次CPU乘法(可能取决于编译模式和运行时根据实际硬件做出的决定)。 – 2013-02-17 10:56:58

0

您总是可以使用decimal来存储两个long数字相乘的结果。

long bigNumber = 12345678L; 
long anotherBigNumber = 23456789L; 
decimal result = bigNumber * anotherBigNumber; 
+1

乘法在你的例子中用'long'完成。即使你在乘法之前转换为“十进制”,也可能没有足够的“空间”。尝试乘以'1000000000000000L'(十五个零)与相同大小的数字。如果你使用'long'乘法,结果将会“环绕”,如果你使用'decimal'乘法,它会抛出一个异常。 – 2013-02-17 10:44:54

+0

他不会说'long'类型的数字。他要求增加64个编号。 – 2013-02-17 10:45:01

0

我想(只要你想)如果第一,你可以做的任何数量的计算,你转换成字符串数(所以两个独立的字符串)比得到的最后一个数字(字符),并乘以与其他角色的每一个数字(就像你在学校学到的一样)等等,并且将你的最终得分数字(也作为字符串)添加到你。我知道这是可以做到的,这将是一开始的王道难题,但是一旦你创建了这个函数,你就可以乘以你想要的任何数字:)

0

如果它们是整数,则使用System.Numerics中的BigInteger类System.Numerics.dll!)

如果没有,Codeplex中有一个BigRational类。它本意是在System.Numerics中,但它被踢了。链接: http://bcl.codeplex.com/releases/view/42782