সজোরে আঘাত
ইন bash
, এটি সম্ভবত এটি হিসাবে হিসাবে ভাল। এটি একটি শেল বিল্টিন ব্যবহার করে। যদি আপনার কোনও ভেরিয়েবলের ফলাফলের প্রয়োজন হয় তবে আপনি কমান্ড সাবস্টিটিউশন বা bash
নির্দিষ্টটি ব্যবহার করতে পারেন (যদিও এখন এটি দ্বারা সমর্থিত zsh
):
printf -v int %.0f "$float"
আপনি করতে পারেন:
float=1.23
int=${float%.*}
তবে এটি আপনাকে নিকটতম পূর্ণসংখ্যার পরিবর্তে ভগ্নাংশটি সরিয়ে ফেলবে এবং এটি $float
পছন্দ 1.2e9
বা .12
উদাহরণের মানগুলির জন্য কাজ করবে না ।
ভাসমানগুলির অভ্যন্তরীণ উপস্থাপনের কারণে সম্ভাব্য সীমাবদ্ধতাগুলিও নোট করুন:
$ printf '%.0f\n' 1e50
100000000000000007629769841091887003294964970946560
আপনি একটি পূর্ণসংখ্যার পেতে পারেন, তবে সম্ভাবনা হ'ল আপনি এই সংখ্যার কোথাও ব্যবহার করতে পারবেন না।
এছাড়াও, যেমন @BinaryZebra দ্বারা লক্ষনীয়, বিভিন্ন মধ্যে printf
বাস্তবায়ন (ব্যাশ, ksh93, যশ, না গনুহ, zsh, ড্যাশ), এটা লোকেল (দশমিক বিভাজক যা হতে পারে দ্বারা প্রভাবিত হয় .
অথবা ,
)।
সুতরাং, যদি আপনার ভাসমানগুলি সর্বদা দশমিক বিভাজক হিসাবে প্রকাশ করা হয় এবং আপনি যদি চান যে এটির printf
স্ক্রিপ্টটি ব্যবহারকারীর লোকাল নির্বিশেষে আপনি এটির মতো চিকিত্সা করেন তবে আপনাকে লোকেলটি সিতে ঠিক করতে হবে:
LC_ALL=C printf '%.0f' "$float"
সহ yash
, আপনি এটি করতে পারেন:
printf '%.0f' "$(($float))"
(নিচে দেখ).
POSIX
printf "%.0f\n" 1.1
পসিক্স %f
সমর্থন করে না যেমন পসিক্স নয়।
প্যাসিকলি, আপনি এটি করতে পারেন:
f2i() {
awk 'BEGIN{for (i=1; i<ARGC;i++)
printf "%.0f\n", ARGV[i]}' "$@"
}
এটির লোকাল দ্বারা প্রভাবিত হয় না (কমাটি দশমিক বিভাজক হতে পারে না awk
কারণ এটি ইতিমধ্যে সিনট্যাক্সের একটি বিশেষ চরিত্র ( print 1,2
যেমন print 1, 2
দুটি আর্গুমেন্ট পাস করার মতো print
)
zsh
ইন zsh
(যা ফ্লোটিং পয়েন্ট গাণিতিক সমর্থন (দশমিক বিভাজক সবসময় সময়ের) হল), আপনি rint()
আপনার সবচেয়ে কাছের পূর্ণসংখ্যা একটি float হিসাবে (মত দিতে গণিত ফাংশন C
) এবং int()
একটি float (মত থেকে একটি পূর্ণসংখ্যা দিতে awk
)। সুতরাং আপনি এটি করতে পারেন:
$ zmodload zsh/mathfunc
$ i=$((int(rint(1.234e2))))
$ echo $i
123
বা:
$ integer i=$((rint(5.678e2)))
$ echo $i
568
তবে মনে রাখবেন যে double
এসগুলি খুব বেশি সংখ্যক প্রতিনিধিত্ব করতে পারে, পূর্ণসংখ্যাগুলি অনেক বেশি সীমাবদ্ধ।
$ printf '%.0f\n' 1e123
999999999999999977709969731404129670057984297594921577392083322662491290889839886077866558841507631684757522070951350501376
$ echo $((int(1e123)))
-9223372036854775808
ksh93
ksh93 হ'ল প্রথম বোর্নের মতো শেল যা ভাসমান পয়েন্ট গণিতকে সমর্থন করে। ksh93 কমান্ড কেবল অন্তর্নির্মিত কমান্ড যখন পাইপ ব্যবহার না করে বা কাঁটাচামচ ব্যবহার না করে কমান্ড প্রতিস্থাপনকে অনুকূল করে তোলে। সুতরাং
i=$(printf '%.0f' "$f")
কাঁটাচামচ করে না বা আরও ভাল:
i=${ printf '%.0f' "$f"; }
যা উভয়ই কাঁটাচামচ করে না তবে নকল সাব্হেল পরিবেশ তৈরি করার সমস্ত ঝামেলাও করে না।
আপনি এটি করতে পারেন:
i=$((rint(f)))
তবে সাবধান:
$ echo "$((rint(1e18)))"
1000000000000000000
$ echo "$((rint(1e19)))"
1e+19
আপনি এছাড়াও করতে পারেন:
integer i=$((rint(f)))
তবে এর জন্য পছন্দ করুন zsh
:
$ integer i=1e18
$ echo "$i"
1000000000000000000
$ integer i=1e19
$ echo "$i"
-9223372036854775808
সাবধান থাকুন যে ksh93
ফ্লোটিং পয়েন্ট গাণিতিক লোকালটিতে দশমিক বিভাজক সেটিংকে সম্মান করে (যদিও ,
অন্যথায় গণিত অপারেটর ( $((1,2))
কোনও ফরাসি / জার্মানিতে 6/5 হবে ... স্থানীয় এবং এটি $((1, 2))
একটি ইংরেজি লোকালে 2) ।
যশ
ইয়াশ ভাসমান পয়েন্ট গণিতকেও সমর্থন করে তবে ksh93
/ zsh
এর মতো গণিতের ফাংশন নেই rint()
। উদাহরণস্বরূপ বাইনারি বা অপারেটরটি ব্যবহার করে আপনি কোনও সংখ্যাকে পূর্ণসংখ্যায় রূপান্তর করতে পারেন (এছাড়াও এতে কাজ করে zsh
তবে সক্রিয় নয় ksh93
)। তবে লক্ষ্য করুন যে এটি দশমিক অংশটি কেটে দেয়, এটি আপনাকে নিকটতম পূর্ণসংখ্যা দেয় না:
$ echo "$((0.237e2 | 0))"
23
$ echo "$((1e19))"
-9223372036854775808
yash
আউটপুটে লোকেলের দশমিক বিভাজককে সম্মান করে, তবে এর গাণিতিক অভিব্যক্তিতে ভাসমান পয়েন্ট আক্ষরিক ধ্রুবকগুলির জন্য নয়, যা বিস্ময়ের কারণ হতে পারে:
$ LC_ALL=fr_FR.UTF-8 ./yash -c 'a=$((1e-2)); echo $(($a + 1))'
./yash: arithmetic: `,' is not a valid number or operator
এটি এমন এক উপায়ে ভাল যে আপনি আপনার স্ক্রিপ্টগুলিতে সময়কাল ব্যবহার করে এমন ভাসমান পয়েন্ট ধ্রুবক ব্যবহার করতে পারেন এবং এটি অন্যান্য লোকেলে কাজ করা বন্ধ করে দেবে এমন চিন্তা করার দরকার নেই, তবে এখনও ব্যবহারকারী দ্বারা প্রকাশিত সংখ্যাগুলির সাথে লেনদেন করতে সক্ষম হবেন যেমনটি আপনি মনে করছেন:
var=$((10.3)) # and not var=10.3
... "$((a + 0.1))" # and not "$(($a + 0.1))".
printf '%.0f\n' "$((10.3))" # and not printf '%.0f\n' 10.3