我构建了一个使用double类型的程序,它运行良好,但我想要的是用它的所有数字打印最终值。为了解释我正在寻找的东西,我写了这个例子:
/* sample number my program might generate */
Double Big = new Double ("2937093129380193810983901274934098138098390183");
/* Double.toString(double) method */
String reallyBigString = Double.toString(Big);
System.out.println(“Double.toString = " + reallyBigString);
/* Big Integer class */
BigInteger reallyBigInteger2 = BigDecimal.valueOf(Big).toBigInteger();
System.out.println("BigInteger = " + reallyBigInteger2);
/* BigDecimal class */
BigDecimal reallyBigInteger1 = new BigDecimal(Big);
System.out.println("BigDecimal = " + reallyBigInteger1);
我想得到什么:
the double real value = 2937093129380193810983901274934098138098390183
我得到了什么:
Double.toString = 2.937093129380194E45
BigInteger = 2937093129380194000000000000000000000000000000
BigDecimal = 2937093129380193767890297090901187942913409024
BigInteger
结果使用了一种值的舍入,我不需要这样。
如何才能获得正确的价值?
答案 0 :(得分:1)
正如@RealSkeptic和@Ken Slade所说,我需要从BigInteger
构建String
,而不是Double
,而不是 /* the sample number converted to a String*/
String Big = new String ("2937093129380193810983901274934098138098390183");
/* BigInteger */
BigInteger reallyBigInteger = new BigInteger(Big);
System.out.println("BigInteger = " + reallyBigInteger);
。
BigInteger = 2937093129380193810983901274934098138098390183
结果是对的:
BigInteger
然后我使用String
和static void Main(string[] args)
{
Console.OutputEncoding = Encoding.UTF8;
Draw(' ', '\u00A9', 20, true);
}
static void Draw(char sym, char back, int length, bool padding)
{
if (length < 5)
{
length = 5;
}
else if ((length % 2) == 0) // Ensure an odd length using a modulo operation
{
length++;
}
if (padding)
{
Console.WriteLine(new string(back, length));
}
int mid = length / 2;
int left = mid;
int right = mid + 1;
do
{
Console.Write(new string(back, left));
Console.Write(new string(sym, right - left));
Console.Write(new string(back, length - right));
Console.WriteLine();
left--;
right++;
}
while (left != 0);
if (padding)
{
Console.WriteLine(new string(back, length));
}
Console.WriteLine();
}
类型从零重建程序。
感谢所有人。
答案 1 :(得分:0)
您没有使用正确的方法将BigDecimal转换为BigInteger
BigInteger reallyBigInteger2 = new BigDecimal(Big).toBigInteger();
通过传递double值创建 new BigDecimal()对象,然后转换为BigInteger将得到正确的结果。
对于BigDecimal:这有点棘手,因为他们不会做同样的事情。 BigDecimal.valueOf(double)将使用传入的double值的canonical String representation来实例化BigDecimal对象。换句话说:BigDecimal对象的值将是您在执行System.out.println(d)时看到的内容。
但是,如果使用新的BigDecimal(d),则BigDecimal将尝试尽可能准确地表示double值。这通常会导致存储的数字比您想要的多得多。严格来说,它比valueOf()更正确,但它不那么直观。