Javaは良いかどうかはわかりませんが、Pythonなどの動的言語と比較すると致命的な問題があります。つまり、型によって引き起こされるいくつかの問題があります。Javaは半静的言語であるため、変数が宣言されると保存されます。タイプに応じてメモリ内にメモリを開きます。次に問題が発生します。私の番号が大きすぎると、オーバーフローしやすくなります。余剰分は取れるとのトピックもありますが、言わないとどうなるでしょうか。その場合、大きな数しか考慮できません。これは、考慮すべき問題が多すぎることを私たちに残します。
幸い、実際にはJavaで多数を処理するためのAPIがあります。コア実装の原則は、実際にはPython 1+1を実装するPythonインタープリターと同じです。
ここで、Pythonインタープリターに1+1を実装するのがどれほど難しいかについて少し話しましょう。まず第一に、Pythonは動的言語であり、最も明白なのは、変数型を宣言する必要がないことです。それなら、書くときはかっこいいので、インタプリタは変数の型をどのように知るのでしょうか?Pythonの最下層がC言語またはJavaであることは誰もが知っています。もちろん、使用するインタプリタ、通常はCによって異なります。インタプリタが使用されます。したがって、本質的に、Pythonコードが実行されている場合、それは実際には実行されているC言語プログラムであり、Pythonコードを推測します。
Javaはプリコンパイルできることは誰もが知っているので、アイデアのコードヒントは非常に優れていますが、Pythonはそうではなく、動的であるため、pycharmのコードヒントはアイデアほど良くないことがわかります。さて、インタプリタが最初に何をしたか見てみましょう。まず、私はコードを実行するC言語プログラムなので、当然、Pythonコードの変数型を推測する必要があります。たとえば、あなたはint型です。はい、C言語プログラムを使用してスペースを割り当てます。問題は、Pythonユーザーの場合、彼は私が入力した数値のみを気にし、変数がオーバーフローするかどうかは気にしないということです。事実高校生の時、C言語に出会うまでオーバーフローの問題について考えていませんでした。したがって、C言語インタプリタもこの型の値の長さを判断する必要があります。長すぎると、多数の方法を使用して処理する必要があります。たとえば、彼は格納する配列を申請します。これもJavaのこのAPIに含まれています。(下の写真)次に、Pythonプログラムが非常に強力であることがわかります。ですから、Pythonプログラマーは優れていますが、これら2つの商品のエンジニアリングを制御するのはより困難です。Javaは長蛇の列ですが、新人でも読めるコードを書くことはできますが、Pythonを試してみてください。そのため、数千行のPythonを書くだけでは不十分だと不満を言う人も多く、実際、このプロジェクトの量が増えているため、下位レベルの人がうまくコントロールすることは困難です。もちろん、コードの迅速性の低さも問題ですが、構文a:intが後でサポートされるため、状況は少し緩和されましたが、エンジニアリングは依然として問題です。
OK、ゴシップはありません。何かをする時が来ました。
大きな整数の処理
BigInteger
これは組み込みの非常に古いバージョンであるため、青いブリッジカップjdk1.7を使用できないことを心配する必要はありませんが、の拡張は1.8以降のようです。これに注意する必要があります。
このBIgIntegerの使用は、実際には非常に簡単です。注意
する必要があるのは、操作にBigIntegerを使用する方法だけです。現時点では直接+-*/できないためです。
割当
2つの方法があります
BigInteger a= new BigInteger("1234567890");
BigInteger b = BigInteger.valueOf("123457890)
足し算、引き算、掛け算、割り算
a.add(b);
a.subtract(b);
a.multiply(b);
a.divide(b)
べき乗関数を見つけ、最大公約数を見つけます
a.pow(2)
a.gcd(b) a,b的最大公约数
そしてもちろんa.abs()
比較判断
eatTo()
compareTo()は、int型のデータを返します。1はより大きい、0は等しい、-1はより小さい、
max()、min():それぞれ大きい(小さい)BigIntegerデータを返します。
//比较大小:compareTo(),max(),min()
@Test
public void testCompare() {
BigInteger bigNum1 = new BigInteger("52");
BigInteger bigNum2 = new BigInteger("27");
//1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
int num = bigNum1.compareTo(bigNum2);
//2.max():直接返回大的那个数,类型为BigInteger
// 等价:return (compareTo(val) > 0 ? this : val);
BigInteger compareMax = bigNum1.max(bigNum2);
//3.min():直接返回小的那个数,类型为BigInteger
// 等价:return (compareTo(val) < 0 ? this : val);
BigInteger compareMin = bigNum1.min(bigNum2);
}
価値
@Test
public void testToAnother() {
BigInteger bigNum = new BigInteger("52");
int radix = 2;
byte[] num1 = bigNum.toByteArray();
String num2 = bigNum.toString();
String num3 = bigNum.toString(radix);//转化为2进制
int num4 = bigNum.intValue();
long num5 = bigNum.longValue();
float num6 = bigNum.floatValue();
double num7 = bigNum.doubleValue();
}
大きな浮動小数点数の処理
BigDecimal
一般的な操作方法も同様です。
いくつかの点
、つまり除算に注意し、小数を維持することに注意してください
public static void main(String[] args)
{
BigDecimal a = new BigDecimal("4.5635");
a = a.setScale(3, RoundingMode.HALF_UP); //保留3位小数,且四舍五入
System.out.println(a);
}
ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入
例
アイデアは非常に単純です、それは多数の問題です
package com.huterox.test03;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
public class 复数幂
{
public static void main(String[] args) throws FileNotFoundException
{
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("复幂数.txt")));
BigInteger a = BigInteger.valueOf(2);
BigInteger b = BigInteger.valueOf(3);
BigInteger x = BigInteger.valueOf(2);
BigInteger y = BigInteger.valueOf(3);
for(int i=2;i<=123456;++i) //每次都是两组数据相乘
{
BigInteger t1 = a.multiply(x);
BigInteger t2 = a.multiply(y);
BigInteger t3 = b.multiply(x);
BigInteger t4 = b.multiply(y);
x = t1.subtract(t4);
y = t2.add(t3);
}
out.println(x.toString()+y.toString()+"i");
out.close();
}
}