ঘন্টা এবং মিনিটের বিন্যাসে কীভাবে ভাসমান সংখ্যা যুক্ত করবেন?


14

ঘন্টা এবং মিনিটের বিন্যাসে কীভাবে ভাসমান সংখ্যা যুক্ত করবেন?

সেগুলো. যদি এই জাতীয় দুটি সংখ্যা গণনা করে 0.35+3.45তবে এটি = হওয়া উচিত 4.20, না3.80

var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]
    
var sum = 0.0;
    
arr.forEach(function(item) {
  console.log(sum);
  sum += parseFloat(item);
});

ফলাফলটি এমন হওয়া উচিত:

0
0.15
0.35
4.20
5.0
7.0
7.30
12.50
13.50
15.30
16.40
19.20
20.20

1
আপনি কিভাবে যুক্তি সংজ্ঞা দেবেন?
জুহিল সোমাইয়া

6
তাহলে 0.2 কি 20 মিনিট বা এক ঘন্টা 0.2 টি উপস্থাপন করে? ১.০ মানে কি এক ঘন্টা, বা ০..6 মানে কি এক ঘন্টা?
স্প্যানেল

2
দুঃখিত, সুতরাং 1.0 মানে 1 ঘন্টা 1 মিনিট ?. উদাহরণস্বরূপ 0.6 এবং 0.7 এর অর্থ কী?
স্পেন

2
আপনি এখানে একটি উত্তর খুঁজে পাবেন: কোড review.stackexchange.com/a/109478 । আপনার সংখ্যাগুলিকে স্ট্রিংয়ে রূপান্তর করুন এবং ফাংশনে "."এই স্ট্রিংগুলিকে বিভক্ত করতে ব্যবহার করুন , না ":"
জেরার্ডো ফুর্তাদো

6
আপনি নিজেকে এই জাতীয় যুক্তি দিয়ে জটিল করে তোলেন। 0.5ঘন্টা 30 মিনিট হওয়া উচিত, অন্য যে কোনও কিছু সম্পূর্ণ যুক্তিযুক্ত। আমি আশা করি এটি বাস্তব জীবনে কোনও ক্লায়েন্টের পক্ষে নয় .. হয় একটি নির্দিষ্ট সময় ইউনিটের ভাসমান মান নিয়ে কাজ করুন বা আপনি ঘন্টা / মিনিট আলাদা করুন। এর মত সহজ.
কদ্দাথ

উত্তর:


7

"পাগল" ডেটা ফর্ম্যাটগুলির সাথে ডিল করার সর্বোত্তম উপায় হ'ল প্রথমে সেগুলি একটি বুদ্ধিমান এবং সহজেই প্রসেসযোগ্য বিন্যাসে রূপান্তর করা, রূপান্তরিত ডেটা ব্যবহার করে আপনার যা যা করা দরকার এবং শেষ পর্যন্ত (যদি আপনাকে একেবারে করতেই হয়) ফলাফলগুলিতে ফিরে রূপান্তর করতে হয় মূল ফর্ম্যাট।

(অবশ্যই, আসল সমাধান হ'ল এই জাতীয় ক্রেজি টাইম উপস্থাপনাগুলি পুরোপুরি ব্যবহার বন্ধ করা But তবে এটি সর্বদা ব্যবহারিক নয়, উদাহরণস্বরূপ, কারণ আপনাকে এমন কোনও উত্তরাধিকার ব্যবস্থার সাথে ইন্টারফেস করতে হবে যা আপনি পরিবর্তন করতে পারবেন না))

আপনার ক্ষেত্রে, আপনার ডেটার জন্য একটি উপযুক্ত বুদ্ধিমান ফর্ম্যাট হতে পারে যেমন মিনিটের অবিচ্ছেদ্য সংখ্যা। একবার আপনি এই ডেটাটি এই ফর্ম্যাটে রূপান্তর করলে আপনি তারপরে সাধারণ গাণিতিক করতে পারেন do

// converts a pseudo-float of the form hh.mm into an integer number of minutes
// robust against floating-point roundoff errors, also works for negative numbers
function hhMmToMinutes(x) {
  const hhmm = Math.round(100 * x)  // convert hh.mm -> hhmm
  return 60 * Math.trunc(hhmm / 100) + (hhmm % 100)
}

// convert minutes back to hh.mm pseudo-float format
// use minutesToHhMm(minutes).toFixed(2) if you want trailing zeros
function minutesToHhMm(minutes) {
  return Math.trunc(minutes / 60) + (minutes % 60) / 100
}

const arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]

let sum = 0
console.log( arr.map(hhMmToMinutes).map(x => sum += x).map(minutesToHhMm) )

নোট করুন যে উপরের রূপান্তর কোডটি প্রথমে ইনপুটটিকে 100 দ্বারা গুণিত করে এবং ঘন্টা এবং মিনিটের অংশগুলি পৃথক করার আগে এটি একটি পূর্ণসংখ্যায় বৃত্তাকার করে। ইনপুটগুলিকে শক্তিশালী করার প্রয়োজন এড়িয়ে গিয়ে সম্ভাব্য বৃত্তাকার ত্রুটিগুলির সাথে দৃ rob়তার সাথে ইনপুটগুলি পরিচালনা করা উচিত।

এখানে অতিরিক্ত যত্ন নেওয়ার কারণ হ'ল 0.01 = 1/100 (এবং এর বহুগুণ) সংখ্যাটি জাভাস্ক্রিপ্ট দ্বারা ব্যবহৃত বাইনারি ফ্লোটিং-পয়েন্ট ফর্ম্যাটে বাস্তবে যথাযথভাবে উপস্থাপনযোগ্য নয় । সুতরাং আপনি আসলে একটি জেএস নম্বর রাখতে পারবেন না যা হুবহু 0.01 সমান হতে পারে - আপনার কাছে সেরাটি এমন একটি নম্বর যা এত কাছাকাছি যে এটিকে স্ট্রিংয়ে রূপান্তর করলে ত্রুটিটি স্বয়ংক্রিয়ভাবে আড়াল হয়ে যায়। তবে রাউন্ডিং ত্রুটিটি এখনও রয়েছে এবং আপনি যদি এমন সংখ্যার সাথে একটি নির্দিষ্ট প্রান্তিকের সাথে তুলনা করার মতো কাজ করার চেষ্টা করেন তবে আপনাকে কামড় দিতে পারে। এখানে একটি দুর্দান্ত এবং সাধারণ প্রদর্শন রয়েছে:

console.log(Math.trunc(100 * 0.29))  // you'd think this would be 29...


7

// We got this after simple addition
// Now we want to change it into 4.2
sample = 3.8

// Now here are the minutes that the float currently shows
minutes = (sample % 1) * 100

// And the hours
hours = Math.floor(sample)

// Here are the number of hours that can be reduced from minutes
AddHours = Math.floor(minutes / 60)

// Adding them to the hours count
hours += AddHours

// Reducing mintues
minutes %= 60

// Finally formatting hour and minutes into your format
final = hours + (minutes / 100.0)
console.log(final)

আপনি সাধারণ গাণিতিক সংযোজন করার পরে এই যুক্তিটি ব্যবহার করতে পারেন, এটি যোগফলকে সময় বিন্যাসে রূপান্তর করবে


2
কেন কেবল ন্যায়বিচারের math.floor(sample/1)পরিবর্তে math.floor(sample)?
সেলবি

2
@selbie, কেবলমাত্র আমি প্রথম যুক্ত করার কারণে sample / 1, আমি যদিও জেএস এটি নিজেই মেঝেতে ফেলব কারণ বিভাজকের কোনও দশমিক ছিল না (যেমনটি sample / 1.0, জেএস ব্যবহারের অনেক সময় ধরে); তবে এটি এত তাড়াতাড়ি আমি গুগল করে যোগ করেছিলাম না floor, এটি মুছে ফেলতে ভুলে গেছি। যাইহোক যে ইঙ্গিত করার জন্য ধন্যবাদ
Letsintegreat

2
আপনার উল্লেখ করা উচিত যে ফলাফলটিতে arrনয় প্রতিটি উপাদানগুলির জন্য এটি করা দরকার। উদাহরণস্বরূপ, arr = [1.5, 2.5]44.4
তিতাস

1
টাইটাস, হ্যাঁ আমি সেই অংশটি মিস করেছি, সুতরাং আমাদের প্রতিটি উপাদান থেকে কয়েক ঘন্টা এবং কয়েক মিনিট আনতে হবে, তারপরে সেগুলি পৃথকভাবে যুক্ত করুন, তবে কেবল আমার পদ্ধতিরই কার্যকর হবে।
লেটসিনগ্রেট

4

জাভাস্ক্রিপ্ট ES6 এ আপনি এখানে যান implementation আমি প্রতিটি উপাদানটি লুপ করেছি, এবং কয়েক ঘন্টা, মিনিট বিভক্ত হয়েছি ., মিনিটগুলি অস্তিত্ব রয়েছে কিনা তা পরীক্ষা করে নেওয়া হয় এবং অন্যকে 0 ঘন্টা এবং মিনিটের মোট সংখ্যা গণনা করে প্রয়োজনীয় গণনা প্রয়োগ করে।

const resultObj = [0.35, 3.45].reduce((a, e) => {
  const [hours, minutes] = e.toString().split('.');
  a.h += +hours;
  a.m += (+(minutes.padEnd(2, 0)) || 0); 
  return a;
}, {h: 0, m: 0});


const result = resultObj.h + Math.floor(resultObj.m / 60) + ((resultObj.m % 60) / 100);
console.log(result);


1
যেমনটি কাজ করবে না, যেমন 0.3 আপনার সমাধান সহ 30 মিনিট নয়, তিন মিনিটের হিসাবে গণ্য হবে as
স্পেন

3

আপনাকে সবকিছুকে ঘন্টা বা মিনিটে রূপান্তর করতে হবে এবং তারপরে গণিত করতে হবে।

Example: 0.35 + 3.45
Convert 0.35 to Hours Number((35/60).toFixed(2))
= 0.58

Then convert 3hours 45 minutes into hours
= 3 + Number((45/60).toFixed(2))
= 3hours + 0.75 hours
= 3.75

Add the 2 conversions
= 0.58 + 3.75
= 4.33 hours

Convert the 0.33 back to minutes by multiplying by 60
= 4 hours 19.8 minutes ~ 20 mins

Hope that helps!

2

আপনাকে এগুলি প্রথমে কয়েক ঘন্টা এবং মিনিটে রূপান্তর করতে হবে

var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4];

function add(arr) {
  var hm = arr
    .map(v => [Math.floor(v), (v % 1).toFixed(2) * 100])  // Map the array to values having [hours, minutes]
    .reduce((t, v) => { //  reduce the array of [h, m] to a single object having total hours and minutes
      t = {
        h: t.h + v[0],
        m: t.m + v[1]
      };
      return t;
    }, {
      h: 0,
      m: 0
    });

  // final result would be = 
  // total hours from above
  // + hours from total minutes (retrived using Math.floor(hm.m / 60)) 
  // + minutes (after converting it to be a decimal part)
  return (parseFloat(hm.h + Math.floor(hm.m / 60)) + parseFloat(((hm.m % 60) / 100).toFixed(2))).toFixed(2);
}

// adding `arr` array
console.log(add(arr));

// adding 0.35+3.45
console.log(add([0.35, 3.45]));


2
দুর্ভাগ্যক্রমে কেউ প্রথমে এটি লক্ষ্য করেনি। এবং যদিও সম্ভবত সঠিক, পড়াশোনা কোথায় আসছে? আপনার সমাধানের ওপি থেকে অনুলিপি করুন এবং আটকান অল্প সময়ের মধ্যে অনেকগুলি কোর্সে সহায়তা করে। তবে এটি একটি বুদ্ধিমান প্রশ্ন যা একটি বুদ্ধিমান ব্যাখ্যা প্রাপ্য।
গেটসেট

2

আমি জানতে পারি আপনি কেন প্রথম ফলাফলটি 0 হতে চান ? নীচে একটি একক লুপ দিয়ে এটি করার একটি উপায়। মন্তব্যগুলি ব্যাখ্যা করার কোডে রয়েছে। প্রতিটি লুপের সাহায্যে আমরা মিনিট যুক্ত করি এবং সেগুলি যদি 60 এর বেশি হয় তবে আমরা একটি ঘন্টা যোগ করি এবং তারপরে অবশিষ্ট মিনিটগুলি পেতে % 60 ব্যবহার করি । কাজ করার জন্য ভেসে যাওয়া ব্যথা হতে পারে,

যেমন 1.1 + 2.2 === 3.3 মিথ্যা

সুতরাং আমি সংখ্যাগুলিকে একটি স্ট্রিংয়ে রূপান্তর করি এবং তারপরে আবার কোন int তে ফিরে আসি।

var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4];
let hoursTally = 0;
let minutesTally = 0;

for(var i = 0; i < arr.length; i++) {
  // Convert the float to a string, as floats can be a pain to add together
  let time = arr[i].toString().split('.');
  // Tally up the hours.
  hoursTally += parseInt(time[0]);
  // Tally up the minutes;
  let minute = time[1];
  if(minute) {
    // We do this so we add 20 minutes, not 2 minutes
    if(minute.length < 2) {
      minutesTally += parseInt(minute) * 10;
    } else {
      minutesTally += parseInt(minute);
    }
    // If the minutesTally is greater than 60, add an hour to hours
    if(minutesTally >= 60) {
      hoursTally++;
      // Set the minutesTally to be the remainder after dividing by 60
      minutesTally = minutesTally % 60;
    }
  }
  console.log(hoursTally + "." + minutesTally);
}


উহ .. সমস্ত উপায়ে .. ২.২ + ১.১ আইএস ৩.৩ 33030 এর অর্থ সহ
ag

1
toString().split('.');- আঃ, সত্যি?
ব্যবহারকারী 253751

3
@ agগল ২75৫ সংখ্যাটি যখন ভাসমান-পয়েন্ট হয় তবে তবে 1.1 + 2.2 নম্বরটি 3.3 নয়। এটি 3.300000000000000001 বা 3.29999999999999 বা কিছু। এর কারণ 1.1 প্রকৃতপক্ষে 1.1 নয় এবং 2.2 প্রকৃতপক্ষে 2.2 নয় এবং 3.3 আসলে ভাসমান পয়েন্টে 3.3 নয়।
ব্যবহারকারী 253751

কেশ বিভক্ত করা শুরু করবেন না - আমি এই অদ্ভুত সংখ্যা স্কিমটি শুরু থেকে বেছে নেব না ... যখন আমি প্রোগ্রামিং শুরু করতাম তখন সম্ভবত আমি সবকিছুকে কয়েক মিনিটে (বা প্রয়োজনে সেকেন্ডে) রূপান্তর করতে পারতাম - এগুলি প্রদর্শনের জন্য আবার রূপান্তর করতাম .. তবে আজকাল
ডেটটাইম

1

const arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]

const reducer = (acc, curr) => {
  acc = `${acc}`.split('.').length > 1 ? acc : `${acc}.0`;
  curr = `${curr}`.split('.').length > 1 ? curr : `${curr}.0`;
  let hours = parseStrAndSum(true, `${acc}`.split('.')[0], `${curr}`.split('.')[0]);
  let minute = parseStrAndSum(false, `${acc}`.split('.')[1], `${curr}`.split('.')[1]);
  hours = parseInt(hours / 1) + parseInt(minute / 60);
  minute = minute % 60;
  console.log(`${acc} + ${curr} = ${hours}.${minute}`);
  return `${hours}.${minute}`;
}

const parseStrAndSum = (is_hours, ...strs) => {
  let result = 0;
  strs.forEach(function(number) {
    if (!is_hours) {
      number = number.length == 1 ? `${number}0` : number;
    }
    result += parseInt(number);
  });
  return result;
};

arr.reduce(reducer);


1
@ এলান 0.15 + 0.2 কেন =0.17? হওয়া আবশ্যক0.35
user12916796

1
তখন আমি ভেবেছিলাম যে দশমিক 0.2টি 20 মিনিটের পরিবর্তে দুই মিনিটের সমান। এখন আমি কোডটি সামঞ্জস্য করেছি, দয়া করে আবার নিশ্চিত করুন।
ইয়ান

1

কোনও মডুলাস হ্রাস করার স্ট্যান্ডার্ড উপায় হ'ল সংক্রমণের পরে ঘাটতি যুক্ত করা যদি কোনও অতিরিক্ত প্রবাহ ঘটে থাকে। উদাহরণস্বরূপ আপনি বাইনারি হার্ডওয়্যার ব্যবহার করে এভাবে বিসিডি সংযোজন করবেন।

যদিও আপনি এভাবে ভাসমানগুলি ব্যবহার করে যোগ করতে পারেন , আপনার উচিত কিনা তা নিয়ে একটি প্রশ্ন রয়েছে । মূলত পূর্ণসংখ্যার পরিমাণগুলি কী তা পরিচালনা করতে ভাসা সংখ্যা ব্যবহারে সমস্যাগুলি সুপরিচিত এবং আমি তাদের এখানে পুনরায় মহড়া দিতে যাচ্ছি না।

সাধারণত, ভাসা ভগ্নাংশের সংযোজন 1.0 এর একটি মডুলাসের সাথে স্পষ্টভাবে কাজ করে, ভগ্নাংশের বাইরে একটি ওভারফ্লোটি পূর্ণসংখ্যার অংশকে বাড়িয়ে তোলে। যদি আমরা বিন্দুটিকে ঘন্টা হিসাবে ব্যাখ্যা করি। উপযুক্ত সময়ে যোগ করার জন্য এটি 0.4 এর ঘাটতি দরকার।

function add_float_hours_minutes(a, b)
{
  var trial_sum = a+b;
  // did an actual overflow occur, has the integer part incremented?
  if ( Math.floor(trial_sum) > Math.floor(a)+Math.floor(b) )  {
    trial_sum += 0.4;
  }
  // has the fractional part exceeded its allotted 60 minutes?
  if ( trial_sum-Math.floor(trial_sum) >= 0.6)  {
    trial_sum += 0.4;
  }
  return trial_sum;
}

var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]

var sum = 0.0;

arr.forEach(function(item) {
  console.log(sum);
  // sum += parseFloat(item);
  sum = add_float_hours_minutes(sum, parseFloat(item));
});

যা নীচের আউটপুট উত্পাদন করে, ওপি যা চেয়েছিল তা চক্রের মধ্যেই সঠিক

0
0.15
0.35
4.2
5.000000000000001
7.000000000000001
7.300000000000001
12.5
13.5
15.3
16.400000000000002
19.2
20.2

আমি চূড়ান্ত বিন্যাস পাঠকের জন্য অনুশীলন হিসাবে দুটি দশমিক স্থানে রেখেছি। তাদের সমস্ত গৌরবটিতে ১৫ টি পিছনের অঙ্কগুলি কেন ভাসা ব্যবহার করা সবচেয়ে ভাল উপায় নয় তার একটি অংশ চিত্রিত করে।

এছাড়াও, আপনি যখন সেকেন্ড বা দিন অন্তর্ভুক্ত করতে চান তখন কী ঘটে তা বিবেচনা করুন। দুটি ভাসমান সেকেন্ডের আরও দুটি স্ট্যান্ডার্ড উপায়, বা একটি পূর্ণসংখ্যার পূর্ণসংখ্যা হঠাৎ করে অনেক বেশি বুদ্ধিমান দেখায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.