ضرب و تقسیم در الکسیر

سلام
من احتیاج دارم که یک ورودی بین 7 تا 168 بگیرم و بعد بفهمم که این عدد ضریبی از 7 هست یا نه اما متاسفانه داخل الکسیر متوجه شدم مثلاً وقتی 4 رو بر 2 تقسیم میکنم بجای عدد 2 عدد 2.0 رو میده و اینا با هم یکی نیستن.خودم با کد زیر حلش کردم :
defmodule Find7 do

def func(x) when x > 6 and is_integer x do
	{num1,num2}=x/7 |> Float.to_string |> Integer.parse
	if num1 in 1..24 and num2===".0" do
		true
	else
		false
	end
end

end
اما واقعاً چرا باید اینطوری باشه هیچ راه بهتری نیست ؟ نمیشه کاری کرد که تو تقسیم بجای مثلاً 12/4=3.0 مستقیم خود عدد 3 رو بده ؟
همین کد تو جاوا :
private int Find7(int dat)
{
for(int i=1;i<=24;i++)
{
if(dat/7==i){
return i;
}
}
return 0;
}
من تو زبون های فانکشنال تازه کارم چرا باید اینطوری باشن چرا نمیشه با حلقه این کارا رو کرد ؟

اولا چرا از فانکشن rem استفاده نمیکنید (rem(49,7

دوما round
Float و به Integer تبدیل میکنه

2 پسندیده

تشکر rem خیلی خیلی بهتر شد
از round استفاده نمیشه کرد چون ممکنه مثلا عدد 8 بیاد که ضریبی از 7 نیست امااین rem خفن بود معادل جاواشم اگر میدونین بگین ممنون میشم

معادل java
% هست
49%7

1 پسندیده

علت این عکس العمل الکسیر تو تقسیم چیه چرا Float میکنه؟

فانکشن div
Integer میده ولی / سعی میکنه جواب و به float بده
(div(4,2
2

4/2 = 2.0

2 پسندیده

یه مورد خارج از این بحث که میبینم که استفاده از if,else هست. @mortezaKcode مثال زیرو ببینید

### with if/else
defmodule Boo do
  def check(a) do
    if a == 1 do
      true
    else 
      false
    end
  end
end

### if/else is not needed  
defmodule Boo do
  def check(a) do
    a == 1
  end
end
1 پسندیده

جالب بود و کد خیلی کوتاهتر و بهتر میشه .راستی شما علت این رفتار الکسیر رو میدونین که چرا تو تقسیم حتی عدد صحیح هم باشه Float میده؟

اين رفتار خاصى نيست، بايد از div براى خروجى integer استفاده كنيد, در اليكسير / هميشه خروجى float ميده. به نظر ميرسه اينكار براى جلوگيرى از نتيجه پيشبينى نشدست(magic). هميشه از / انتظار float داشته باشيد و از div انتظار integer. زبانهاى ديگه اى هم هستند كه كار مشابهى ميكنند. اين باعث ميشه كه دقيقا بدونيد كه دنبال چى هستيد و بايد از چه روشى استفاده كنيد.
فقط يه حدثه

1 پسندیده

اها پس جالبه ، در مورد ارلنگ یجا خوندم که برا سیستم هایی با تحمل نقص بالا طراحی شده
یه همچین جمله ای بود دقیق یادم نیس ولی احتمال میدم به همین قضیه مربوطه اگر اشتباه نکنم
در کل هرچی بده خیلی باحاله و می ارزه

بيشتر توضيح بده :thinking:

1 پسندیده

http://ilikephp.ir/news/300/معرفی-زبان-برنامه-نویسی---سرور-Erlang-اژدهای-هزار-سر
یکم از این لینک خوندم مابقی هم پیدا میکنم میفرستم

اینکه میاد حتی روی نتیجه هم اثر میزاره و بجای Integer نوع Float میده بیرون یعنی حتی کوچکترین احتمالات ممکن رو هم در نظر در میگیره تا خطا رو به حداقل ممکن برسونه اگر اشتباه میکنم تصحیح کنید فکر کنم تنها دلیلش همین باشه

1 پسندیده

شاید, اما تنها دلیل ممکنه این نباشه

1 پسندیده

این لینک پر از اشتباهه

1 پسندیده

چیز خاصی ننوشته اما در کل تو ایران فکر کنم تعداد خیلی کمی به ارلنگ مسلط هستن برای همین حتماً اشتباهم ممکنه باشه

غیر اون دلیل دیگه ای به ذهنم نمیرسه ولی در کل برام تجربه جالبی بود و دوسه تا چیز به یاد موندنی هم یاد گرفتم

من كلا از با اطمينان در مورد اينجور چيزا حرف زدن پرهيز ميكنم. اينكه بگيم تنها دليل يكمى سنگينه.

1 پسندیده