این بخش با بحث دربارهٔ کلاس Number در Package java.lang، زیرکلاسهای آن و موقعیتهایی که به جای انواع اولیهٔ عددی از نمونههای این کلاسها استفاده میکنید، آغاز میشود.
همچنین کلاسهای PrintStream و DecimalFormat را معرفی میکند که Methodهایی برای نوشتن خروجی عددی قالببندیشده فراهم میکنند.
در نهایت، کلاس Math در java.lang بررسی میشود. این کلاس توابع ریاضی برای تکمیل عملگرهای تعبیهشده در زبان دارد. Methodهایی برای توابع مثلثاتی، توابع نمایی و غیره در آن وجود دارد.
هنگام کار با اعداد، بیشتر اوقات از انواع اولیه در کد خود استفاده میکنید. برای مثال:
int i = 500;
float gpa = 3.65f;
byte mask = 0x7f;
با این حال، دلایلی برای استفاده از اشیا به جای Primitiveها وجود دارد و پلتفرم جاوا کلاسهای Wrapper را برای هر یک از انواع دادهٔ اولیه فراهم میکند. این کلاسها Primitive را در یک شیء «بستهبندی» میکنند. اغلب این بستهبندی توسط کامپایلر انجام میشود — اگر در جایی که شیء مورد انتظار است از Primitive استفاده کنید، کامپایلر Primitive را در کلاس Wrapper خودش برای شما بستهبندی (Box) میکند. بهطور مشابه، اگر از شیء عددی در جایی که Primitive مورد انتظار است استفاده کنید، کامپایلر شیء را بازگشایی (Unbox) میکند. برای اطلاعات بیشتر بخش Autoboxing and Unboxing را ببینید.
تمام کلاسهای Wrapper عددی زیرکلاسهای کلاس انتزاعی Number هستند:
[تصویر: سلسلهمراتب کلاس Number — شامل Byte, Short, Integer, Long, Float, Double]
نکته: چهار زیرکلاس دیگرNumberوجود دارد که اینجا بررسی نمیشوند.BigDecimalوBigIntegerبرای محاسبات با دقت بالا استفاده میشوند.AtomicIntegerوAtomicLongبرای برنامههای چندرشتهای استفاده میشوند.
سه دلیل برای استفاده از شیء Number به جای Primitive وجود دارد:
MIN_VALUE و MAX_VALUE که حد بالا و پایین نوع داده را مشخص میکنند.Methodهای زیر مقدار شیء Number را به نوع Primitive بازگرداندهشده تبدیل میکنند:
byte byteValue()short shortValue()int intValue()long longValue()float floatValue()double doubleValue()Methodهای زیر شیء Number را با آرگومان مقایسه میکنند:
int compareTo(Byte anotherByte)int compareTo(Double anotherDouble)int compareTo(Float anotherFloat)int compareTo(Integer anotherInteger)int compareTo(Long anotherLong)int compareTo(Short anotherShort)boolean equals(Object obj)Method equals(Object obj) مشخص میکند که آیا شیء عددی با آرگومان برابر است یا خیر. این Methodها true برمیگردانند اگر آرگومان null نباشد و شیئی از همان نوع با مقدار عددی یکسان باشد. الزامات اضافی برای اشیای Double و Float در مستندات Java API توضیح داده شده است.
هر کلاس Number Methodهای دیگری برای تبدیل اعداد به رشته و بالعکس و تبدیل بین سیستمهای عددی دارد. جدول زیر Methodها را در کلاس Integer فهرست میکند. Methodهای سایر زیرکلاسهای Number مشابه هستند:
| Method | توضیح |
|---|---|
static Integer decode(String s) | یک رشته را به عدد صحیح رمزگشایی میکند. نمایش رشتهای اعداد اعشاری، هشتهجدهی یا شانزدههجدهی را بهعنوان ورودی میپذیرد. |
static int parseInt(String s) | عدد صحیح (فقط اعشاری) برمیگرداند. |
static int parseInt(String s, int radix) | با دریافت نمایش رشتهای اعداد اعشاری، دودویی، هشتهجدهی یا شانزدههجدهی (radix به ترتیب برابر ۱۰، ۲، ۸ یا ۱۶)، عدد صحیح برمیگرداند. |
String toString() | شیء Stringای که مقدار این Integer را نمایش میدهد برمیگرداند. |
static String toString(int i) | شیء Stringای که عدد صحیح مشخصشده را نمایش میدهد برمیگرداند. |
static Integer valueOf(int i) | شیء Integer حاوی مقدار Primitive مشخصشده برمیگرداند. |
static Integer valueOf(String s) | شیء Integer حاوی مقدار نمایش رشتهای مشخصشده برمیگرداند. |
static Integer valueOf(String s, int radix) | شیء Integer حاوی مقدار عدد صحیح نمایش رشتهای مشخصشده که با مقدار radix تجزیه شده برمیگرداند. برای مثال، اگر s = "333" و radix = 8، Method معادل عدد اعشاری عدد هشتهجدهی 333 را برمیگرداند. |
قبلاً استفاده از Methodهای print و println برای چاپ رشتهها در خروجی استاندارد System.out را دیدید. از آنجا که تمام اعداد میتوانند به رشته تبدیل شوند، میتوانید از این Methodها برای چاپ ترکیبی دلخواه از رشتهها و اعداد استفاده کنید. با این حال، زبان جاوا Methodهای دیگری دارد که کنترل بیشتری بر خروجی چاپی هنگام وجود اعداد فراهم میکنند.
Package java.io شامل کلاس PrintStream است که دو Method قالببندی دارد: format و printf. این دو Method معادل یکدیگر هستند. System.out که تا حالا استفاده میکردید، در واقع یک شیء PrintStream است.
ساختار نحوی این دو Method یکسان است:
public PrintStream format(String format, Object... args)
که در آن format رشتهای است که قالببندی مورد استفاده را مشخص میکند و args لیست متغیرهایی است که با آن قالببندی چاپ میشوند.
مشخصههای قالب (Format Specifiers) با علامت درصد (%) شروع و با یک مبدل (Converter) ختم میشوند. مبدل کاراکتری است که نوع آرگومان را مشخص میکند. بین علامت درصد و مبدل میتوانید Flag و Specifier اختیاری داشته باشید.
int i = 461012;
System.out.format("The value of i is: %d%n", i)
%d مشخص میکند که متغیر واحد یک عدد صحیح اعشاری است. %n کاراکتر جدید خط مستقل از پلتفرم است. خروجی:
The value of i is: 461012
Methodهای printf و format Overload شدهاند. هرکدام نسخهای با ساختار زیر دارند:
public PrintStream format(Locale l, String format, Object... args)
برای مثال، برای چاپ اعداد در سیستم فرانسوی (جایی که کاما به جای نقطه در نمایش اعداد اعشاری استفاده میشود):
System.out.format(Locale.FRANCE,
"The value of the float " + "variable is %f, while the " +
"value of the integer variable " + "is %d, and the string is %s%n",
floatVar, intVar, stringVar);
جدول زیر برخی از مبدلها و Flagهایی که در برنامهٔ نمونهٔ TestFormat.java استفاده شدهاند را فهرست میکند:
| مبدل | Flag | توضیح |
|---|---|---|
| d | عدد صحیح اعشاری. | |
| f | عدد اعشاری (float). | |
| n | کاراکتر جدید خط مناسب پلتفرم. همیشه از %n به جای \\n استفاده کنید. | |
| tB | تبدیل تاریخ و زمان — نام کامل ماه وابسته به Locale. | |
| td, te | تبدیل تاریخ و زمان — روز ماه با ۲ رقم. td صفرهای پیشرو لازم دارد، te ندارد. | |
| ty, tY | تبدیل تاریخ و زمان — ty = سال ۲ رقمی، tY = سال ۴ رقمی. | |
| tl | تبدیل تاریخ و زمان — ساعت در ساعت ۱۲ ساعته. | |
| tM | تبدیل تاریخ و زمان — دقیقه با ۲ رقم با صفرهای پیشرو. | |
| tp | تبدیل تاریخ و زمان — am/pm وابسته به Locale (حروف کوچک). | |
| tm | تبدیل تاریخ و زمان — ماه با ۲ رقم. | |
| tD | تبدیل تاریخ و زمان — تاریخ به شکل %tm%td%ty | |
| 08 | عرض ۸ کاراکتری با صفرهای پیشرو. | |
| + | شامل علامت، مثبت یا منفی. | |
| , | شامل کاراکترهای گروهبندی وابسته به Locale. | |
| - | چیدمان چپچین. | |
| .3 | سه رقم بعد از نقطهٔ اعشار. | |
| 10.3 | عرض ۱۰ کاراکتری، راستچین، با سه رقم بعد از نقطهٔ اعشار. |
برنامهٔ زیر برخی قالببندیهایی که با format امکانپذیر است را نشان میدهد:
import java.util.Calendar;
import java.util.Locale;
public class TestFormat {
void main() {
long n = 461012;
System.out.format("%d%n", n); // "461012"
System.out.format("%08d%n", n); // "00461012"
System.out.format("%+8d%n", n); // " +461012"
System.out.format("%,8d%n", n); // 461,012"
System.out.format("%+,8d%n%n", n); // "+461,012"
double pi = Math.PI;
System.out.format("%f%n", pi); // "3.141593"
System.out.format("%.3f%n", pi); // "3.142"
System.out.format("%10.3f%n", pi); // " 3.142"
System.out.format("%-10.3f%n", pi); // "3.142"
System.out.format(Locale.FRANCE,
"%-10.4f%n%n", pi); // "3,1416"
Calendar c = Calendar.getInstance();
System.out.format("%tB %te, %tY%n", c, c, c); // "May 29, 2006"
System.out.format("%tl:%tM %tp%n", c, c, c); // "2:34 am"
System.out.format("%tD%n", c); // "05/29/06"
}
}
نکته: بحث این بخش فقط پایههای Methodهای---formatوprintfرا پوشش میدهد. جزئیات بیشتر در بخش Basic I/O این آموزش، صفحهٔ «Formatting» موجود است. استفاده ازString.format()برای ایجاد رشتهها در بخشStringsبررسی شده است.
میتوانید از کلاس java.text.DecimalFormat برای کنترل نمایش صفرهای پیشرو و پسوندی، پیشوندها و پسوندها، جداکنندههای هزارگان و جداکنندهٔ اعشار استفاده کنید. DecimalFormat انعطافپذیری زیادی در قالببندی اعداد فراهم میکند، اما میتواند کد شما را پیچیدهتر کند.
برنامهٔ زیر استفاده از DecimalFormat را نشان میدهد:
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value ) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
IO.println(value + " " + pattern + " " + output);
}
static public void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
}
}
خروجی:
123456.789 ###,###.### 123,456.789
123456.789 ###.## 123456.79
123.78 000000.000 000123.780
12345.67 $###,###.### $12,345.67
جدول زیر هر خط خروجی را توضیح میدهد:
| مقدار | Pattern | خروجی | توضیح |
|---|---|---|---|
| 123456.789 | ###,###.### | 123,456.789 | علامت پوند (#) نشاندهندهٔ رقم است، کاما جایگزین جداکنندهٔ هزارگان و نقطه جایگزین جداکنندهٔ اعشار است. |
| 123456.789 | ###.## | 123456.79 | مقدار سه رقم سمت راست نقطهٔ اعشار دارد، اما Pattern فقط دو رقم دارد. Method format با گرد کردن بالا این مشکل را حل میکند. |
| 123.78 | 000000.000 | 000123.780 | Pattern صفرهای پیشرو و پسوندی را مشخص میکند، چون کاراکتر 0 به جای علامت پوند (#) استفاده شده. |
| 12345.67 | $###,###.### | $12,345.67 | اولین کاراکتر Pattern علامت دلار ($) است. توجه کنید که بلافاصله قبل از رقم سمت چپ در خروجی قالببندیشده قرار دارد. |
زبان برنامهنویسی جاوا حساب پایه را با عملگرهای حسابی پشتیبانی میکند: +، -، *، / و %. کلاس Math در Package java.lang Methodها و ثابتهایی برای انجام محاسبات ریاضی پیشرفتهتر فراهم میکند.
Methodهای کلاس Math همگی Static هستند، پس مستقیماً از کلاس فراخوانی میشوند:
Math.cos(angle);
نکته: با استفاده از قابلیت Static Import، لازم نیستMathرا جلوی هر تابع ریاضی بنویسید:import static java.lang.Math.*;با این کار میتوانید Methodهای کلاس Math را با نام ساده فراخوانی کنید. برای مثال:cos(angle);
کلاس Math شامل دو ثابت است:
کلاس Math بیش از ۴۰ Method Static دارد. جدول زیر تعدادی از Methodهای پایه را فهرست میکند.
double abs(double d)float abs(float f)int abs(int i)long abs(long lng)double ceil(double d): کوچکترین عدد صحیحی که بزرگتر یا مساوی آرگومان است. بهصورت double برگردانده میشود.double floor(double d): بزرگترین عدد صحیحی که کوچکتر یا مساوی آرگومان است. بهصورت double برگردانده میشود.double rint(double d): عدد صحیحی که نزدیکترین مقدار به آرگومان است. بهصورت double برگردانده میشود.long round(double d) و int round(float f): نزدیکترین long یا int به آرگومان.double min(double arg1, double arg2)float min(float arg1, float arg2)int min(int arg1, int arg2)long min(long arg1, long arg2)double max(double arg1, double arg2)float max(float arg1, float arg2)int max(int arg1, int arg2)long max(long arg1, long arg2)برنامهٔ زیر BasicMathDemo نحوهٔ استفاده از برخی از این Methodها را نشان میدهد:
public class BasicMathDemo {
public static void main(String[] args) {
double a = -191.635;
double b = 43.74;
int c = 16, d = 45;
System.out.printf("The absolute value " + "of %.3f is %.3f%n",
a, Math.abs(a));
System.out.printf("The ceiling of " + "%.2f is %.0f%n",
b, Math.ceil(b));
System.out.printf("The floor of " + "%.2f is %.0f%n",
b, Math.floor(b));
System.out.printf("The rint of %.2f " + "is %.0f%n",
b, Math.rint(b));
System.out.printf("The max of %d and " + "%d is %d%n",
c, d, Math.max(c, d));
System.out.printf("The min of of %d " + "and %d is %d%n",
c, d, Math.min(c, d));
}
}
خروجی:
The absolute value of -191.635 is 191.635
The ceiling of 43.74 is 44
The floor of 43.74 is 43
The rint of 43.74 is 44
The max of 16 and 45 is 45
The min of 16 and 45 is 16
double exp(double d): مبنای لگاریتمهای طبیعی، e، به توان آرگومان را برمیگرداند.double log(double d): لگاریتم طبیعی آرگومان را برمیگرداند.double pow(double base, double exponent): مقدار آرگومان اول به توان آرگومان دوم را برمیگرداند.double sqrt(double d): جذرِ آرگومان را برمیگرداند.برنامهٔ ExponentialDemo:
public class ExponentialDemo {
public static void main(String[] args) {
double x = 11.635;
double y = 2.76;
System.out.printf("The value of " + "e is %.4f%n",
Math.E);
System.out.printf("exp(%.3f) " + "is %.3f%n",
x, Math.exp(x));
System.out.printf("log(%.3f) is " + "%.3f%n",
x, Math.log(x));
System.out.printf("pow(%.3f, %.3f) " + "is %.3f%n",
x, y, Math.pow(x, y));
System.out.printf("sqrt(%.3f) is " + "%.3f%n",
x, Math.sqrt(x));
}
}
خروجی:
The value of e is 2.7183
exp(11.635) is 112983.831
log(11.635) is 2.454
pow(11.635, 2.760) is 874.008
sqrt(11.635) is 3.411
کلاس Math مجموعهای از توابع مثلثاتی نیز فراهم میکند. مقدار ورودی هر یک از این Methodها زاویهای به رادیان است. میتوانید از Method toRadians(double d) برای تبدیل از درجه به رادیان استفاده کنید.
double sin(double d): سینوس مقدار double مشخصشده.double cos(double d): کسینوس مقدار double مشخصشده.double tan(double d): تانژانت مقدار double مشخصشده.double asin(double d): آرسینوس مقدار double مشخصشده.double acos(double d): آرکسینوس مقدار double مشخصشده.double atan(double d): آرتانژانت مقدار double مشخصشده.double atan2(double y, double x): مختصات مستطیلی (x, y) را به مختصات قطبی (r, theta) تبدیل و theta را برمیگرداند.double toDegrees(double d) و double toRadians(double d): آرگومان را به درجه یا رادیان تبدیل میکند.برنامهٔ TrigonometricDemo:
public class TrigonometricDemo {
public static void main(String[] args) {
double degrees = 45.0;
double radians = Math.toRadians(degrees);
System.out.format("The value of pi " + "is %.4f%n",
Math.PI);
System.out.format("The sine of %.1f " + "degrees is %.4f%n",
degrees, Math.sin(radians));
System.out.format("The cosine of %.1f " + "degrees is %.4f%n",
degrees, Math.cos(radians));
System.out.format("The tangent of %.1f " + "degrees is %.4f%n",
degrees, Math.tan(radians));
System.out.format("The arcsine of %.4f " + "is %.4f degrees %n",
Math.sin(radians),
Math.toDegrees(Math.asin(Math.sin(radians))));
System.out.format("The arccosine of %.4f " + "is %.4f degrees %n",
Math.cos(radians),
Math.toDegrees(Math.acos(Math.cos(radians))));
System.out.format("The arctangent of %.4f " + "is %.4f degrees %n",
Math.tan(radians),
Math.toDegrees(Math.atan(Math.tan(radians))));
}
}
خروجی:
The value of pi is 3.1416
The sine of 45.0 degrees is 0.7071
The cosine of 45.0 degrees is 0.7071
The tangent of 45.0 degrees is 1.0000
The arcsine of 0.7071 is 45.0000 degrees
The arccosine of 0.7071 is 45.0000 degrees
The arctangent of 1.0000 is 45.0000 degrees
---
Method random() عددی پسودو-تصادفی بین ۰.۰ و ۱.۰ برمیگرداند. بازه شامل ۰.۰ اما شامل ۱.۰ نیست. یعنی: 0.0 <= Math.random() < 1.0. برای دریافت عدد در بازهای متفاوت، میتوانید عملیات حسابی روی مقدار برگرداندهشده انجام دهید. برای مثال، برای تولید عدد صحیح بین ۰ تا ۹:
int number = (int)(Math.random() * 10);
با ضرب مقدار در ۱۰، بازهٔ مقادیر ممکن به 0.0 <= number < 10.0 تبدیل میشود.
استفاده از Math.random زمانی خوب عمل میکند که فقط به یک عدد تصادفی نیاز داشته باشید. اگر به تولید مجموعهای از اعداد تصادفی نیاز دارید، باید نمونهای از java.util.Random ایجاد کنید و Methodهای آن شیء را برای تولید اعداد فراخوانی کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/